<?php

use libphonenumber\NumberParseException;
use libphonenumber\PhoneNumberUtil;
use think\Db;
use think\Cache;
use app\api\model\Send;

//实体转字符,并且全路径 转 相对路径，存数据库时
function in_content($content)
{
    if ($content) {
        $content = htmlspecialchars_decode(html_entity_decode($content), ENT_QUOTES);//把 HTML 实体转换为字符

        preg_match_all("/src=\"(.*?)\"/", $content, $img);

        foreach ($img[1] as $k => $v) {
            if (strpos($v, 'http') !== false || strpos($v, 'https') !== false) {
                if (is_https()) {
                    $prefix = 'https://';
                } else {
                    $prefix = 'http://';
                }
                // $_SERVER['HTTP_HOST'] 域名 ;SITE_PATH 自定义常量，入口文件所在目录路径
                $temp = str_replace($prefix . $_SERVER['HTTP_HOST'] . SITE_PATH, '', $v);
                $content = str_replace($v, $temp, $content);
            }
        }
    }
    return $content;
}



function commonRedis(){
    $redis = new \Redis();
    $redis->connect('127.0.0.1',getenv('REDIS_PORT'));
    return $redis;
}



function chmodRecursive($path, $dirPerm, $filePerm) {
    
    if (is_dir($path)) {
        // 修改当前文件夹权限
        chmod($path, $dirPerm);

        // 遍历子项
        $items = new RecursiveIteratorIterator(
            new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::SKIP_DOTS),
            RecursiveIteratorIterator::SELF_FIRST
        );

        foreach ($items as $item) {
            $fullPath = $item->getPathname();
            if ($item->isDir()) {
                chmod($fullPath, $dirPerm);
            } else {
                chmod($fullPath, $filePerm);
            }
        }
        return true;
    }
    return false;
}










//相对路径 转 全路径，从数据库取出时
function out_content($content)
{
    if ($content) {
        preg_match_all("/src=\"(.*?)\"/", $content, $img);
        preg_match_all("/poster=\"(.*?)\"/", $content, $img2);

        $img[1] = array_merge($img[1], $img2[1]);

        $img[1] = array_unique($img[1]);

        foreach ($img[1] as $k => $v) {
            if (strpos($v, 'http') === false && strpos($v, 'https') === false) {
                if (is_https()) {
                    $prefix = 'https://';
                } else {
                    $prefix = 'http://';
                }
                // $_SERVER['HTTP_HOST'] 域名 ;SITE_PATH 自定义常量，入口文件所在目录路径
                $content = str_replace($v, checkpath($prefix . $_SERVER['HTTP_HOST'] . SITE_PATH . '/' . $v), $content);
            }
        }
    }
    return $content;
}

// 访问来源是否是https
function is_https()
{
    if (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') {
        return TRUE;
    } else if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
        return TRUE;
    } else if (!empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off') {
        return TRUE;
    }

    return FALSE;
}

// 开启数据缓存
function _cache($name = '')
{
    if ($name == 'db') {
        return true;
    }
}

// 加密和解密
// 函数encrypt($string,$operation,$key)中$string：
// 需要加密解密的字符串；$operation：判断是加密还是解密，E表示加密，D表示解密；$key：密匙。
function _encrypt($string, $operation = 'E', $key = 'http://www.ffxiang.cn/QQ474944111')
{
    $key = md5($key);
    $key_length = strlen($key);
    $string = $operation == 'D' ? base64_decode($string) : substr(md5($string . $key), 0, 8) . $string;

    $string_length = strlen($string);

    $rndkey = $box = array();
    $result = '';
    for ($i = 0; $i <= 255; $i++) {
        $rndkey[$i] = ord($key[$i % $key_length]);
        $box[$i] = $i;
    }
    for ($j = $i = 0; $i < 256; $i++) {
        $j = ($j + $box[$i] + $rndkey[$i]) % 256;
        $tmp = $box[$i];
        $box[$i] = $box[$j];
        $box[$j] = $tmp;
    }
    for ($a = $j = $i = 0; $i < $string_length; $i++) {
        $a = ($a + 1) % 256;
        $j = ($j + $box[$a]) % 256;
        $tmp = $box[$a];
        $box[$a] = $box[$j];
        $box[$j] = $tmp;
        $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
    }
    // return substr($result,8);
    // return [$result,$box,$rndkey];
    if ($operation == 'D') {
        if (substr($result, 0, 8) == substr(md5(substr($result, 8) . $key), 0, 8)) {
            return substr($result, 8);
        } else {
            // return '';
            return substr($result, 8);
        }
    } else {
        return str_replace('=', '', base64_encode($result));
    }
}

// 会员解密
function _Dencrypt($text)
{

    if (!$text) return false;
    $text = _encrypt($text, 'D');
    // return $text;
    $text = explode('|www.ffxiang.cn|', $text);
    if (!$text) return false;

    $id = abs($text[0]);
    $password = $text[1];
    if (!$password) {
        return false;
    }
    if ($id && $password) {
        $db = Db::name('member')->where(['id' => $id, 'password' => $password, 'hide' => 1])->value('id');
        if ($db == $id) {
            return $db;
        } else {
            return false;
        }
    } else {
        return false;
    }
}

// 获取IP地区
function _ip($ip = '')
{
    //判断服务器是否允许$_SERVER
    if (isset($_SERVER)) {
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $realip = $_SERVER['HTTP_X_FORWARDED_FOR'];
        } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
            $realip = $_SERVER['HTTP_CLIENT_IP'];
        } else {
            $realip = $_SERVER['REMOTE_ADDR'];
        }
    } else {
        //不允许就使用getenv获取
        if (getenv("HTTP_X_FORWARDED_FOR")) {
            $realip = getenv("HTTP_X_FORWARDED_FOR");
        } elseif (getenv("HTTP_CLIENT_IP")) {
            $realip = getenv("HTTP_CLIENT_IP");
        } else {
            $realip = getenv("REMOTE_ADDR");
        }
    }

    if ($realip == '::1') {
        $realip = '127.0.0.1';
    }
    return $realip;
}

//生成缩略图 （未完成）
function _img($img)
{
    if ($img) {
        return $img;
    } else {
        $data = '/Public/style/index/img/images.jpg';
    }
    return $data;
}

// 限制标题长度
// $title 字符串
// $length 限制数量
function _substr($title, $length = 20, $dian = '...')
{
    if (mb_strlen($title) <= $length) {
        $data = $title;
    } else {
        $data = mb_substr($title, 0, $length, 'utf-8') . $dian;
    }
    return $data;
}


// 通过ID读取会员信息
// $id 会员唯一ID
// $name 字段值
function _user($id = '', $name = '', $fuhao = '****')
{
    if (!$id) return '';
    // 昵称 > 用户名 > 手机号码 > 邮箱
    $data = Db::name('user')->master()->where(['id' => $id, 'delete_time' => 0])->find();
    if (!$data) {
        return;
    }

    // 获取会员昵称
    if ($data['name']) {
        $data['name'] = $data['name'];
        // }else if($data['user']){
        //     $data['name']=$data['user'];
    } else if ($data['phone']) {
        if ($fuhao) {
            $data['name'] = substr($data['phone'], 0, 3) . $fuhao . substr($data['phone'], 7, 4);
        } else {
            $data['name'] = $data['phone'];
        }
    } else if ($data['email']) {
        if (!$fuhao) {
            $email = explode('@', $data['email']);
            $data['name'] = substr($data['email'], 0, 2) . $fuhao . $email[1];
        } else {
            $data['name'] = $data['email'];
        }
    } else {
        $data['name'] = '用户' . $data['id'];
    }
    // if(!$data['qianming']){
    //     $data['qianming']='这家伙好懒，什么都不留下！';
    // }
    if (!$data['head_portrait']) {
        $data['head_portrait'] = _imgUrl('1') . 'public/style/index/member/img/userimg.gif';
    } else {
        // $data['img']=_imgUrl($data['addfangshi']).$data['img'];
    }
    $data['head_portrait'] = checkpath($data['head_portrait']);
    $data['img'] = checkpath($data['head_portrait']);

    if ($name) {
        return $data[$name];
    } else {
        return $data;
    }
}
/**
 * 非必须实时用户数据
 * @Author   9527
 * @DateTime 2022-10-14
 * @param    int        $id    用户id
 * @param    string     $field 筛选条件
 * @return   mixed
 */
function _user_cache($id, $field = 'id,name,head_portrait,head_100,self_slogan,entertainment'){
    if (!$id) return false;
    $data = Db::name('user')->master()->where(['id' => $id, 'delete_time' => 0])->field($field)->find();
    if ($data) {
        return $data;
    }
    return false;
}

// 获取用户昵称
function _username($data, $fuhao = '****')
{
    // 获取会员昵称
    if ($data['nickname']) {
        $data['username'] = $data['nickname'];
    } else if ($data['mobile']) {
        if ($fuhao) {
            $data['username'] = substr($data['mobile'], 0, 3) . $fuhao . substr($data['mobile'], 7, 4);
        } else {
            $data['username'] = $data['mobile'];
        }
    } else {
        $data['username'] = '用户' . $data['id'];
    }
    return $data['username'];
}

// 会员头像
function _userImg($img = '', $w = '', $h = '')
{
    if (!$img) {
        return '/public/style/index/member/img/userimg.gif';
    } else {
        return $img;
    }
}

// 其他函数

/**
 *  检测手机号格式
 * @return array
 */
function _isMobile($mobile = '', $prefix = '')
{
    $swissNumberStr = '+' . ltrim($prefix . $mobile, '+');

    $phoneUtil = PhoneNumberUtil::getInstance();

    try {
        $swissNumberProto = $phoneUtil->parse($swissNumberStr);
    } catch (NumberParseException $e) {
        return ['code' => 400, 'msg' => $e->getMessage()];
    }

    $isValid = $phoneUtil->isValidNumber($swissNumberProto);

    $result = $isValid ? ['code' => 200, 'msg' => 'success'] : ['code' => 400, 'msg' => '手机号格式不正确'];
    return $result;
}

/*检测是否邮箱*/
// $email 邮箱号码
function _isEmail($email = '')
{
    if (mb_strlen($email) < 5) {
        return false;
    }
    $res = "/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/";
    if (preg_match($res, $email)) {
        return true;
    } else {
        return false;
    }
}

// 发送验证码
// 1表示验证码发送成功 其他表示都是失败
// $username 用户号码
// $content  验证码说明
function _code($username = '', $content = '')
{
    if (!$username) {
        return '号码不能为空';
    }
    if (!$content) {
        return '验证码第二个参数不可为空，请检查_code()函数第二个参数';
    }
    //检测号码格式是否正确
    $mobile = $email = false;
    if (_isMobile()) {
        $mobile = $username;
        $name = '手机';
    } else if (_isEmail($username)) {
        $email = $username;
        $name = '邮箱';
    } else {
        return '号码格式错误，请检查号码是否正确1';
    }
    if (!$mobile && !$email) {
        return '号码格式错误，请检查号码是否正确2';
    }
    $ip = _ip();
    if (!$ip) return 'IP地区异常或无法获取IP';
    // 检测验证安全、频繁的问题
    // 检测限制每天发送验证码数量   主要防止恶意轰炸机和其他攻击
    $nus = 10;    // 每天发送10个验证码
    $count = Db::name('code')->where('username', $username)->whereTime('time', 'd')->fetchSql(false)->count();
    if ($count > $nus) {
        return '请不要频繁刷验证码，每天最多获取' . $nus . '个，请明天获取';
    }
    $time = time();
    // 验证每120秒发送1次
    $db = Db::name('code')->where('username', $username)->order('id desc')->find();
    if ($db) {
        $maturity = $db['time'] + $db['maturity'];
        if ($maturity > $time) {
            return '请不要频繁操作，等待' . ($maturity - $time) . '秒后再获取' . $name . '验证码';
        }
    }
    // 检测结束
    $code = rand(100000, 999999);
    $shijian = 120;   // 验证码倒计时
    $where['username'] = $username;
    $where['code'] = $code;
    $where['time'] = time();
    $where['maturity'] = $shijian;
    $where['ip'] = $ip;
    $where['content'] = $content;
    $where['system'] = $_SERVER['HTTP_USER_AGENT'];


    // 判断通知模板类型
    if ($content == '注册') {
        $temp['name'] = 'tempReg';
        $sdkMobile = 'sdkReg';
    } else if ($content == '找回密码') {
        $temp['name'] = 'tempPwd';
        $sdkMobile = 'sdkPwd';
    } else if ($content == '绑定邮箱' || $content == '绑定手机') {
        $temp['name'] = 'tempMobile';
        $sdkMobile = 'sdkMobile';
    } else if ($content == '重置密码') {
        $temp['name'] = 'tempCz';
        $sdkMobile = 'sdkcz';
    } else {
        $temp = false;
        $sdkMobile = false;
    }
    if ($temp) {
        // 读取通知模板内容
        $temp['type'] = 'sdkTemp';
        $temp = Db::name('member_config')->where($temp)->value('text');
        $time = 2;    // 验证码有效期
        $title = config('config')['title'];
        $temp = str_replace("\${code}", $code, $temp);
        // 将验证码发送到用户邮箱
        $Send = new Send;
        if ($name == '邮箱') {
            $result = $Send->email(['email' => $username, 'content' => $temp]);
            if ($result !== true) {
                $data = '邮箱发送失败，请检查后台邮箱配置是否正确，' . $result;
            } else {
                $data = 1;
            }
        } else if ($name == '手机') {
            // 将验证码发送到用户手机
            if (!$sdkMobile) {
                return 'sdkMobile比较值不存在';
            }
            $sdkMobile = Db::name('member_config')->where('name', $sdkMobile)->value('text');
            $result = $Send->sms([
                'param' => ["code" => "$code"],
                'mobile' => $username,
                'template' => $sdkMobile,
            ]);
            if ($result !== true) {
                $data = '短信发送失败：' . $result;
            } else {
                $data = 1;
                $data = Db::name('code')->insert($where);
            }
        } else {
            $data = '$name比较错误';
        }
    } else {
        $data = '模板通知内容获取错误';
    }


    return $data;
}

// 检测验证码
// 1表示检测成功  其他验证失败
// $code 验证码
// $username 号码类别 手机或邮箱
// 验证验证码 手机
function _codechecking($code = '', $username = '')
{
    if (!$code) return '请输入验证码';
    if (!$username) return '请输入号码';
    // 检验手机或邮箱格式是否正确
    // 检测账户格式
    $mobile = $email = false;
    if (_isMobile()) {   // 如果是手机
        $mobile = $username;
    } elseif (_isEmail($username)) {   // 如果是邮箱
        $email = $username;
    } else {
        return '号码未知或格式错误1';
    }
    if (!$mobile && !$email) return '号码未知或格式错误2';
    // 读取数据验证
    $db = Db::name('code')->where(['code' => $code, 'username' => $username])->find();
    // 判断验证码是否存在
    if (!$db) {
        if ($mobile) {
            return '手机验证码错误';
        } else if ($email) {
            return ['邮箱验证码错误'];
        } else {
            return ['验证码错误，请重新输入'];
        }
    }
    // 判断验证码是否过期
    $time = time();
    $jdate = $db['time'] + $db['maturity'];
    if ($time > $jdate) return '验证码过期，请重发验证码';
    // 判断IP是否一致（可选，若验证出现问题，请删除代码）
    if (md5(_ip()) != md5($db['ip'])) return 'IP发送和IP验证不一致，请重新验证';
    // 判断提交验证和数据是否一致
    if (md5($db['code']) == md5($code) && md5($db['username']) == md5($username)) {
        Db::name('code')->where('id', $db['id'])->setField('type', 1);
        return 1;
    } else {
        if ($mobile) {
            return '手机验证码错误';
        } else if ($email) {
            return ['邮箱验证码错误'];
        } else {
            return ['验证码错误，请重新输入'];
        }
    }

}

function _mobile($mobile)
{
    if (!$mobile) {
        return '';
    }
    $data = substr($mobile, 0, 3) . '****' . substr($mobile, 7, 4);
    return $data;
}

// 获取配置
function _imgUrl($fangshi = '')
{
    if (is_https()) {
        $prefix = 'https://';
    } else {
        $prefix = 'http://';
    }

    if (strlen(SITE_PATH) > 1) {
        return $prefix . $_SERVER['HTTP_HOST'] . SITE_PATH;
    } else {
        return $prefix . $_SERVER['HTTP_HOST'];
    }


    if ($fangshi == '1') {
        return config()['appconfig']['url'] . '/';
    }
    return '';
    $db = db::name('member_config')->where(['type' => 'sdkQiniu'])->cache(_cache('db'))->select();
    return $db['3']['text'];
}

// 数组比较
function _inArray($b, $a)
{
    if (!$b || !$a) {
        return;
    }
    foreach ($a as $value) {
        if (strtolower($value) == strtolower($b)) {
            echo true;
            break;
        }
    }
}

// 转换视频时间00:00
function videoDate($date)
{
    $date = intval($date);
    if (!$date) {
        return;
    }
    if ($date < 59) {
        $data = '00:' . $date;
    } else {
        $hour = floor($date / 3600);
        $minute = floor(($date - 3600 * $hour) / 60);
        if ($minute < 10) {
            $minute = "0" . $minute;
        }
        $second = floor((($date - 3600 * $hour) - 60 * $minute) % 60);
        if ($second < 10) {
            $second = "0" . $second;
        }
        $data = $minute . ':' . $second;
    }
    return $data;
}

function _time($time)
{
    $text = '';
    $time = $time === NULL || $time > time() ? time() : intval($time);
    $t = time() - $time; //时间差 （秒）
    $y = date('Y', $time) - date('Y', time());//是否跨年
    switch ($t) {
        case $t == 0:
            $text = '刚刚';
            break;
        case $t < 60:
            $text = $t . '秒前'; // 一分钟内
            break;
        case $t < 60 * 60:
            $text = floor($t / 60) . '分钟前'; //一小时内
            break;
        case $t < 60 * 60 * 24:
            $text = floor($t / (60 * 60)) . '小时前'; // 一天内
            break;
        case $t < 60 * 60 * 24 * 3:
            $text = floor($time / (60 * 60 * 24)) == 1 ? '昨天 ' . date('H:i', $time) : '前天 ' . date('H:i:s', $time); //昨天和前天
            break;
        case $t < 60 * 60 * 24 * 30:
            $text = date('Y-m-d H:i:s', $time); //一个月内
            break;
        case $t < 60 * 60 * 24 * 365 && $y == 0:
            $text = date('Y-m-d H:i:s', $time); //一年内
            break;
        default:
            $text = date('Y-m-d H:i:s', $time); //一年以前
            break;
    }
    return $text;
}

//字符串截取
function cut_str($sourcestr, $cutlength)
{
    $returnstr = '';

    $i = 0;

    $n = 0;

    $str_length = strlen($sourcestr);//字符串的字节数

    while (($n < $cutlength) and ($i <= $str_length)) {

        $temp_str = substr($sourcestr, $i, 1);

        $ascnum = Ord($temp_str);//得到字符串中第$i位字符的ascii码

        if ($ascnum >= 224)    //如果ASCII位高与224，

        {

            $returnstr = $returnstr . substr($sourcestr, $i, 3); //根据UTF-8编码规范，将3个连续的字符计为单个字符

            $i = $i + 3;            //实际Byte计为3

            $n++;            //字串长度计1

        } elseif ($ascnum >= 192) //如果ASCII位高与192，

        {

            $returnstr = $returnstr . substr($sourcestr, $i, 2); //根据UTF-8编码规范，将2个连续的字符计为单个字符

            $i = $i + 2;            //实际Byte计为2

            $n++;            //字串长度计1

        } elseif ($ascnum >= 65 && $ascnum <= 90) //如果是大写字母，

        {

            $returnstr = $returnstr . substr($sourcestr, $i, 1);

            $i = $i + 1;            //实际的Byte数仍计1个

            $n++;            //但考虑整体美观，大写字母计成一个高位字符

        } else                //其他情况下，包括小写字母和半角标点符号，

        {

            $returnstr = $returnstr . substr($sourcestr, $i, 1);

            $i = $i + 1;            //实际的Byte数计1个

            $n = $n + 0.5;        //小写字母和半角标点等与半个高位字符宽...

        }
    }

    if ($str_length > $i) {

        $returnstr = $returnstr . "...";//超过长度时在尾处加上省略号

    }

    return $returnstr;
}

// 检查图片路径是否多了'/'
function checkpath($str)
{
    $str = str_replace('///', '/', $str);
    if (substr_count($str, '//') > 1) {
        $arr = explode('//', $str);
        $str = $arr[0] . '//' . $arr[1] . '/' . $arr[2];
    }
    return $str;
}


function recommend_code()
{
    $len = 8;
    $chars = "0123456789";
    mt_srand(10000000 * (double)microtime());
    for ($i = 0, $str = '', $lc = strlen($chars) - 1; $i < $len; $i++) {
        $str .= $chars[mt_rand(0, $lc)];
    }
    return $str;
}


function yqmuser($yqr)
{
    if (!$yqr) {
        return "";
    } else {
        return Db::table('user')->where('yqm', $yqr)->value('name');
    }
}

function Ftime($time = null)
{
    if (!$time) {
        return "现在";
    }
    $diff = time() - $time;
    if ($diff < 60) {
        return "刚刚";
    } elseif ($diff < 3600) {
        return floor($diff / 60) . "分钟前";
    } elseif ($diff < 86400) {
        return floor($diff / 3600) . "小时前";
    } elseif ($diff < (86400 * 7)) {
        return floor($diff / 86400) . "天前";
    } elseif ($diff < (86400 * 30)) {
        return floor($diff / 86400 / 7) . "周前";
    } elseif ($diff < (86400 * 60)) {
        return floor($diff / 86400 / 30) . "个月前";
    } else {
        return date("Y-m-d H:i:s", $time);
    }
}

//不同环境下获取真实的IP
function get_ip()
{
    //判断服务器是否允许$_SERVER
    if (isset($_SERVER)) {
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $realip = $_SERVER['HTTP_X_FORWARDED_FOR'];
        } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
            $realip = $_SERVER['HTTP_CLIENT_IP'];
        } else {
            $realip = $_SERVER['REMOTE_ADDR'];
        }
    } else {
        //不允许就使用getenv获取  
        if (getenv("HTTP_X_FORWARDED_FOR")) {
            $realip = getenv("HTTP_X_FORWARDED_FOR");
        } elseif (getenv("HTTP_CLIENT_IP")) {
            $realip = getenv("HTTP_CLIENT_IP");
        } else {
            $realip = getenv("REMOTE_ADDR");
        }
    }

    if ($realip == '::1') {
        $realip = '127.0.0.1';
    }

    return $realip;
}

//根据用户ID得到昵称
function getname($id)
{
    return Db::table('user')->where('id', $id)->value('name');
}

//根据用户ID得到头像
function gethead($id)
{
    return Db::table('user')->where('id', $id)->value('head_portrait');
}

//邀请码生成
function code()
{
    $len = 5;
    $chars = "ABCDEFGHIJKLMNPQRSTUVWXYZ123456789";
    for ($i = 0, $str = '', $lc = strlen($chars) - 1; $i < $len; $i++) {
        $str .= $chars[mt_rand(0, $lc)];
    }
    return $str;
}

//随机昵称生成
function suiji()
{
    // $len = 3;
    // $chars = "ABCDEFGHIZKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
    $char1 = ['赵', '钱', '孙', '李', '周', '吴', '郑', '王', '冯', '陈', '褚', '卫', '蒋',
        '沈', '韩', '杨', '朱', '秦', '尤', '许', '何', '吕', '施', '张', '孔', '曹', '严', '华', '金', '魏',
        '陶', '姜', '戚', '谢', '邹', '喻', '柏', '水', '窦', '章', '云', '苏', '潘', '葛', '奚', '范', '彭',
        '郎', '鲁', '韦', '昌', '马', '苗', '凤', '花', '方', '任', '袁', '柳', '鲍', '史', '唐', '费', '薛',
        '雷', '贺', '倪', '汤', '滕', '殷', '罗', '毕', '郝', '安', '常', '傅', '卞', '齐', '元', '顾', '孟',
        '平', '黄', '穆', '萧', '尹', '姚', '邵', '湛', '汪', '祁', '毛', '狄', '米', '伏', '成', '戴', '谈',
        '宋', '茅', '庞', '熊', '纪', '舒', '屈', '项', '祝', '董', '梁', '杜', '阮', '蓝', '闵', '季', '贾',
        '路', '娄', '江', '童', '颜', '郭', '梅', '盛', '林', '钟', '徐', '邱', '骆', '高', '夏', '蔡', '田',
        '樊', '胡', '凌', '霍', '虞', '万', '支', '柯', '管', '卢', '莫', '柯', '房', '裘', '缪', '解', '应',
        '宗', '丁', '宣', '邓', '单', '杭', '洪', '包', '诸', '左', '石', '崔', '吉', '龚', '程', '嵇', '邢',
        '裴', '陆', '荣', '翁', '荀', '于', '惠', '甄', '曲', '封', '储', '仲', '伊', '宁', '仇', '甘', '武',
        '符', '刘', '景', '詹', '龙', '叶', '幸', '司', '黎', '溥', '印', '怀', '蒲', '邰', '从', '索', '赖',
        '卓', '屠', '池', '乔', '胥', '闻', '莘', '党', '翟', '谭', '贡', '劳', '逄', '姬', '申', '扶', '堵',
        '冉', '宰', '雍', '桑', '寿', '通', '燕', '浦', '尚', '农', '温', '别', '庄', '晏', '柴', '瞿', '阎',
        '连', '习', '容', '向', '古', '易', '廖', '庾', '终', '步', '都', '耿', '满', '弘', '匡', '国', '文',
        '寇', '广', '禄', '阙', '东', '欧', '利', '师', '巩', '聂', '关', '荆', '司马', '上官', '欧阳', '夏侯',
        '诸葛', '闻人', '东方', '赫连', '皇甫', '尉迟', '公羊', '澹台', '公冶', '宗政', '濮阳', '淳于', '单于',
        '太叔', '申屠', '公孙', '仲孙', '轩辕', '令狐', '徐离', '宇文', '长孙', '慕容', '司徒', '司空'];

    $char2 = ['伟', '刚', '勇', '毅', '俊', '峰', '强', '军', '平', '保', '东', '文', '辉', '力', '明', '永', '健', '世', '广', '志', '义',
        '兴', '良', '海', '山', '仁', '波', '宁', '贵', '福', '生', '龙', '元', '全', '国', '胜', '学', '祥', '才', '发', '武', '新',
        '利', '清', '飞', '彬', '富', '顺', '信', '子', '杰', '涛', '昌', '成', '康', '星', '光', '天', '达', '安', '岩', '中', '茂',
        '进', '林', '有', '坚', '和', '彪', '博', '诚', '先', '敬', '震', '振', '壮', '会', '思', '群', '豪', '心', '邦', '承', '乐',
        '绍', '功', '松', '善', '厚', '庆', '磊', '民', '友', '裕', '河', '哲', '江', '超', '浩', '亮', '政', '谦', '亨', '奇', '固',
        '之', '轮', '翰', '朗', '伯', '宏', '言', '若', '鸣', '朋', '斌', '梁', '栋', '维', '启', '克', '伦', '翔', '旭', '鹏', '泽',
        '晨', '辰', '士', '以', '建', '家', '致', '树', '炎', '德', '行', '时', '泰', '盛', '雄', '琛', '钧', '冠', '策', '腾', '楠',
        '榕', '风', '航', '弘', '秀', '娟', '英', '华', '慧', '巧', '美', '娜', '静', '淑', '惠', '珠', '翠', '雅', '芝', '玉', '萍',
        '红', '娥', '玲', '芬', '芳', '燕', '彩', '春', '菊', '兰', '凤', '洁', '梅', '琳', '素', '云', '莲', '真', '环', '雪', '荣',
        '爱', '妹', '霞', '香', '月', '莺', '媛', '艳', '瑞', '凡', '佳', '嘉', '琼', '勤', '珍', '贞', '莉', '桂', '娣', '叶', '璧',
        '璐', '娅', '琦', '晶', '妍', '茜', '秋', '珊', '莎', '锦', '黛', '青', '倩', '婷', '姣', '婉', '娴', '瑾', '颖', '露', '瑶',
        '怡', '婵', '雁', '蓓', '纨', '仪', '荷', '丹', '蓉', '眉', '君', '琴', '蕊', '薇', '菁', '梦', '岚', '苑', '婕', '馨', '瑗',
        '琰', '韵', '融', '园', '艺', '咏', '卿', '聪', '澜', '纯', '毓', '悦', '昭', '冰', '爽', '琬', '茗', '羽', '希', '欣', '飘',
        '育', '滢', '馥', '筠', '柔', '竹', '霭', '凝', '晓', '欢', '霄', '枫', '芸', '菲', '寒', '伊', '亚', '宜', '可', '姬', '舒',
        '影', '荔', '枝', '丽', '阳', '妮', '宝', '贝', '初', '程', '梵', '罡', '恒', '鸿', '桦', '骅', '剑', '娇', '纪', '宽', '苛',
        '灵', '玛', '媚', '琪', '晴', '容', '睿', '烁', '堂', '唯', '威', '韦', '雯', '苇', '萱', '阅', '彦', '宇', '雨', '洋', '忠',
        '宗', '曼', '紫', '逸', '贤', '蝶', '菡', '绿', '蓝', '儿', '翠', '烟', '小', '轩'];
    // mt_srand(10000000*(double)microtime());  
    for ($i = 0, $str1 = '', $lc = count($char1) - 1; $i < 1; $i++) {
        $str1 .= $char1[mt_rand(0, $lc)];
    }
    for ($i = 0, $str2 = '', $lc = count($char2) - 1; $i < 2; $i++) {
        $str2 .= $char2[mt_rand(0, $lc)];
    }

    $str = $str1 . $str2;

    return $str;
}


//认证视频
function authvideo($id)
{
    $videourl = Db::table('authentication_img')->where('user_id', $id)->value('video');

    return $videourl;
}

function curl($url, $datas, $types = 1)
{
    if ($datas && $types) {
        $datas = json_decode($datas, true);
        $field = '';
        foreach ($datas as $k => $v) {
            $field .= $k . '=' . urlencode($v) . '&';
        }
        $field = trim($field, '&');
    } else {
        $field = "data=$datas";
    }

    $curl = curl_init();

    curl_setopt_array($curl, array(
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_SSL_VERIFYHOST => false,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_POSTFIELDS => $field,
        CURLOPT_HTTPHEADER => array(
            "Content-Type:application/x-www-form-urlencoded"
        ),
    ));

    $response = curl_exec($curl);

    $err = curl_error($curl);

    curl_close($curl);

    if ($err) {
        return ['code' => 400, 'msg' => "cURL Error #:" . $err];
    } else {
        return ['code' => 200, 'data' => $response];
    }

}

// ---------  mall --------------
function checkJson($data)
{
    if (!$data) return false;

    $data = json_decode($data, true);

    if (!is_array($data)) return false;

    $data = array_unique($data);// 去重

    return $data;
}

/**
 * 转换返回值格式
 * @param $data
 */
function changeCode($data, $json = 1)
{
    $contain = [];

    foreach ($data as $k => $v) {

        if (isset($v['success'])) {
            foreach ($v['success'] as $m => $n) {
                $contain[$k . '.' . 'success' . '.' . $m] = $json ? json(['code' => 200, 'msg' => $n]) : $n;
            }
        }

        if (isset($v['error'])) {
            foreach ($v['error'] as $m => $n) {
                $contain[$k . '.' . 'error' . '.' . $m] = $json ? json(['code' => 400, 'msg' => $n]) : $n;
            }
        }
    }

    return $contain;
}

/**
 * 相对路径转绝对路径
 * @param string $path
 * @return string
 */
function changeUrl($path = '', $local = 0)
{
    if ($path && strpos($path, 'http://') === false && strpos($path, 'https://') === false) {
        $oss = $local ? 0 : getenv('APP_OSS');

        if ($oss) {
            $path = 'https://' . getenv('OSS_BUCKET') . '.' . getenv('OSS_ENDPOINT') . $path;
        } else {
            $prefix = is_https() ? 'https://' : 'http://';
            $prefix = strlen(SITE_PATH) > 1 ? $prefix . $_SERVER['HTTP_HOST'] . SITE_PATH : $prefix . $_SERVER['HTTP_HOST'];

            if (is_array($path)) {
                foreach ($path as $key => $item) {
                    $path[$key] = checkpath($prefix . '/' . $item);
                }
            } else {
                $path = checkpath($prefix . '/' . $path);
            }
        }
    }

    return $path;
}

/**
 * 绝对路径转相对路径
 * @param string $path
 * @return string
 */
function returnUrl($path = '')
{
    if ($path) {
        $prefix = is_https() ? 'https://' : 'http://';
        $prefix = strlen(SITE_PATH) > 1 ? $prefix . $_SERVER['HTTP_HOST'] . SITE_PATH : $prefix . $_SERVER['HTTP_HOST'];

        if (is_array($path)) {
            foreach ($path as $key => $item) {
                $path[$key] = str_replace($prefix, '', $item);
            }
        } else {
            $path = str_replace($prefix, '', $path);
        }
    }

    return $path;
}

function distance($latitude, $longitude)
{
    $data = "case 
        when xuni_discount = '0.0' then 
            ROUND(
                6378.138 * 2 * ASIN(
                    SQRT(
                        POW(
                            SIN(
                                (" . $latitude . " * PI() / 180 - latitude * PI() / 180) / 2
                            ), 2
                        ) + COS (" . $latitude . " * PI() / 180) * COS(latitude * PI() / 180) * POW(
                            SIN(
                                (" . $longitude . " * PI() / 180 - longitude * PI() / 180) / 2
                            ), 2
                        )
                    )
                ) * 1000
            ) 
        else 
            xuni_discount END distance";

    return $data;
}

/**
 * 计算两点之间的距离
 * @param $lng1 经度1
 * @param $lat1 纬度1
 * @param $lng2 经度2
 * @param $lat2 纬度2
 * @param int $unit m，km
 * @param int $decimal 位数
 * @return float
 */
function _distance($lng1, $lat1, $lng2, $lat2, $unit = 2, $decimal = 2)
{
    $EARTH_RADIUS = 6370.996; // 地球半径系数
    $PI           = 3.1415926535898;

    $radLat1 = $lat1 * $PI / 180.0;
    $radLat2 = $lat2 * $PI / 180.0;

    $radLng1 = $lng1 * $PI / 180.0;
    $radLng2 = $lng2 * $PI / 180.0;

    $a = $radLat1 - $radLat2;
    $b = $radLng1 - $radLng2;

    $distance = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2)));
    $distance = $distance * $EARTH_RADIUS * 1000;

    if ($unit === 2) {
        $distance /= 1000;
    }

    return round($distance, $decimal);
}
/**
 * 计算两点之间的距离
 * @param $lng1 经度1
 * @param $lat1 纬度1
 * @param $lng2 经度2
 * @param $lat2 纬度2
 * @return float
 */
function _distance2($lng1, $lat1, $lng2, $lat2)
{

    $EARTH_RADIUS = 6370.996; // 地球半径系数
    $PI           = 3.1415926535898;

    $radLat1 = $lat1 * $PI / 180.0;
    $radLat2 = $lat2 * $PI / 180.0;

    $radLng1 = $lng1 * $PI / 180.0;
    $radLng2 = $lng2 * $PI / 180.0;

    $a = $radLat1 - $radLat2;
    $b = $radLng1 - $radLng2;

    $distance = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2)));
    $distance = $distance * $EARTH_RADIUS * 1000;

    if ($distance > 1000) {
        $distance /= 1000;
        $distance = round($distance, 2) . 'km';
    } else {
        $distance = round($distance, 1) . 'm';
    }

    return $distance;
}

function changeTime($data)
{
    if ($data['hide_online_time']) {
        $time = '保密';
    } else {
        $time = strtotime($data['last_login_datetime']);

        $diff = time() - $time;
        if ($data['is_online']) {
            $time = "在线";
        } else if ($diff < 60) {
            $time = "刚刚";
        } else if ($diff < 3600) {
            $time = floor($diff / 60) . "分钟前";
        } else if ($diff < 86400) {
            $time = floor($diff / 3600) . "小时前";
        } else if ($diff < (86400 * 7)) {
            $time = floor($diff / 86400) . "天前";
        } else if ($diff < (86400 * 30)) {
            $time = floor($diff / 86400 / 7) . "周前";
        } else if ($diff < (86400 * 366)) {
            $time = floor($diff / 86400 / 30) . "个月前";
        } else if ($diff < (86400 * 366 * 3)) {
            $time = floor($diff / 86400 / 365) . "年前";
        } else {
            $time = date("Y-m-d H:i:s", $time);
        }
    }

    return $time;
}


function changeTimeLen($time) {
    if ($time >= 60) {
        $minute = floor($time / 60);

        $second = $time % 60;

        $minute = (int)$minute >= 10 ? $minute : '0' . $minute;
     } else {
        $minute = '00';
        $second = $time;
    }

    $second = (int)$second >= 10 ? $second : '0' . $second;

    return $minute . ':' . $second;
}

function readyOrder($types, $user_id, $money, $method)
{
    $current_time = time();

    $data = [
        'types' => $types,
        'number' => uniqid(),
        'user_id' => $user_id,
        'money' => $money,
        'pays' => $method,
        'create_time' => $current_time,
        'update_time' => $current_time,
    ];

    return $data;
}

function getRsaPostParamArr()
{
    $ParamStr = decrypt($_POST['z']);

    $pattern = "/\[([^=]+)=\{\{(.*?)\}\}\]/";

    preg_match_all($pattern, $ParamStr,$match);

    $Params = array();
    for($i=0;$i<count($match[1]);$i++){
        $Params[$match[1][$i]] = strval($match[2][$i]);
    }

    return $Params;
}

function decrypt($msg)
{
    $decrypted = "";

    $key = "-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALPNJX5Im8e1HhLQ
cN0blmJEdbbdGLlguU76CmbqTwwhxqTf5idzGYvgq1T8Xa/FcOz0ZrAXBLWy+bNc
PCI7XNvIg5+cw6Q9bbrL9OmJsNZmyR0hZc7O9fHycw+zNJymMYRJBRENMraGrlHK
Ol335OAFfSJ/OqyxtXTiVjw0hY7pAgMBAAECgYBF8AIpgOy3Xcf44YNFPjnct2xi
WNYJJYpvIetx5KoiufCeqUjJB4hkVFvQjumSOWaXhOl8jTeTxa5DChmJ5zVS0Goc
k7LfhHqilO86xoOBUK9/dIR/mHZ60VTmynLMwGlWN7Tfkv2OD/JHPTTvCbxuBQfQ
iL27lR3CighzEBJIAQJBAO7XFPQx8mfIwOsMuYwNwjHGjIxo0gkyWKlhDpvKxZbQ
DW6c+xYZee7t8058c803Rxvj/0iVWUlC+NxnNN2TSEECQQDAuC5KatvRcfhlh0Lu
6X9q3n2+CrlmDz6+z1JcXlHJJL3nB2e2IhqDlTw5VwnLHswdKEkrA5mtCw0ynMAn
c9ypAkBoIVPcZ45VG1yo3gJjgnghNXx/lw/DvLSVHGC/Ibfl2c2RZVW/O9pChnHm
zTG7zhbtnQjm/15PJ6jShxiwZg9BAkBx4+anX+MsMZhEF918Z00/kODqkFfkcpn4
FXls0OiwYCBCCeRGhHz6yhTfJgrJmRezG32yB9ynoOJZyLzeE+CRAkEAwnyLgtd5
LUGw21LgxXVL6wCoKp7Rbo0iTA7QLuo1O4Ub7OUe4cEk4HpLZrcqXEjqmOqclcJK
QL7ylT4uSxSq7Q==
-----END PRIVATE KEY-----";

    openssl_private_decrypt(base64_decode($msg),$decrypted,$key);//私钥解密
    return $decrypted;
}

function getRsaPostParamArr2()
{
    $ParamStr = decrypt2($_POST['z']);

    $pattern = "/\[([^=]+)=\{\{(.*?)\}\}\]/";

    preg_match_all($pattern, $ParamStr,$match);

    $Params = array();
    for($i=0;$i<count($match[1]);$i++){
        $Params[$match[1][$i]] = strval($match[2][$i]);
    }

    return $Params;
}

function decrypt2($msg)
{
    $decrypted = "";

    $key = "-----BEGIN PRIVATE KEY-----
MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQCtABfZMMnuFfsC
Vzx7hVq0qROvaWa1wtynpxE41BLz2Nht52X8fKUO2C0hKFog9EPz8JHgp7s1iT6v
chkpFPTX+YkIy01W7BmhF49WBpNENMEkyLZbkxFwxET9vMGJ4sDhXLlQodVZZ9R7
hnS0xdIpqSlZXNFZ9hO3y+u0fNFehiacQTX7tCJ1VRUPXoJ0+F7ss6H3N4hVeESC
K8puDnl9xRpRY2BGA5xOqbeimtugjTZ/0dfZt2e8G6Uf0ejhliZHQe65cuTu5wn1
bqu0ZFbhwByRyKBDqgwzFPv8y+Eq19opbcJqjGDP3B2BtBjsl/HrrJkxtbtSiF1n
QfIzuUH/bNH5JFzjvf0oWsBOxcl9RPChKJrPU0Ys8OgDYd4VMBGzZY7hhqPdZeah
B6gXqlAjJ5TqX4pu74ytWzllAP+1PFXt26F1AjTesE5rhnJxN9iL6nI1l0qHzEG+
55hczhVVeIh1ypfMVsFUo88N5fR0CphaiqW6PPtqzNosMVxpgPYJgQr7NcOiZaqZ
faPaA1eg2L4OGA7f0GWLdzHDiRsTVPufZbnlntxswgYu3/y6rkwXY+KMMNACa989
1yKuIWIqo+VPE2eXrB5IhU1a7bOkhr/OSXg2c2lBCu+G4lTp6mJ+IgL1FzLYFWUB
Z6q7p8XLHjlvdHvky+CKfjXKGL1PKwIDAQABAoICABKQtP54zuK+9x3sMLBswiwr
DNLBM+WDkNxpAF8h2xrSBX/d2kL7OVdbeZRaWTm6HOS7x1vdhCidnt2DGBIhjpjy
zXLlJlqSobl45sfrkrg6FRQWegNfx/pbBbBZJkfezqYgpj5x74xVqSbMag/QPtp7
rdVKMak+0CTkPFo1Ht7O9KvGD74AOcZvp//rO4LD+KPcLyBxlC7f5jI18tZWtVD6
6vUa/gTldEu4yN0pUzJqlROoeEqD9RzptpGwnBZBX8A74huCqfC9WIM/KiwErJIz
ZJ18cz5vrDl7IgOh+Xr4iQ/zGG8Iu4by7zOxGQ+iyrJo5lPAVebofWWMXSqR0fQi
/EHAnjmkiiM2IaLQVokT8E4RmAm38xmGJZDdxOCVu1WkSAqOWNZ/DCaM5BXLoVWK
AhnCzWWSn7hR7F0epcuTikIpTPk1D3jmJXIgU2e8FEcF3t5KiVJkK/TUFgdkJgns
vBIeBzueCHpUs3oHzxfO22jVXOGaMaKZQfRcjYzsU2VR99Gbmp61w76pBDi7Ygwz
7Ksrx3ZD8hF8+X1ml5vYTQMzs8VNDfZFK9e0dELNhiskFG3lpyeKZxhi0vmvH/V0
6zFRtVRDcR7cmBrOjdC3/35rbvpTeGwpltlaxr5u87ANULxtoPatdOCvf9A5V4t/
+Oo+4oJs5UyglnWpfRGZAoIBAQDgxm4Wa3LWPOdNFjE53tuhLEUDmUYJu+9BzVE6
HHZCWavc35aHNgiyhT8yFO/BlqWEOTXqMrOqSSfgFtUjHH2Qyuyv3tLYqDuy+YZq
UynBQZ4DJ7t1HrcQ0PHpdXjB+BZeGt5xSJEwgn/Z3DsQdFP4SIdGETkZyNgqIQGh
hzS3L+7Jo3THhr3irgBN5pT5vbuZNAGkerqYRLyQcL21vMCCrrCarshHimNQjmxL
/kMiA07W1upI4jTn1rjXdOsRT8LrF4xH1wLHaZC1ViVsZ5AsOq76l6HPtw/coVmS
4BmBHqRW53d2sUuT47r/xV5tn6OdA+uPdFLLaCv8UiB+qbz/AoIBAQDFCGwegYCH
hJFE0NjJyJUZ1YpW8VO1CQpsj+ckKX44KNGjxxq3q64MWrxSnxtAlsuquV69hI/9
i6Gq3d+6QVbaP/7SLOcHkEcz/dphVdcdoMDobFwEHnWRrWgN8GMKNK9w/K8v6P8w
bxWJoxTRBNEMoCJyIG05Wz0sOMLzD92K07HDMWCrKbLP2LqliJJmyvDu/blMR72S
+FDY4u8JUAnzyyYq6+t6zPvTKS1mmst+asGy4WjT+t0Adg3mxKOSwqHIuSZjgq2L
XeS0KEw7Ic8zYeiQvxn9+g8Jk9kq6ERIbZCX3ThO9MeRSESJJbFXbEQh74KqEh1v
UVRbHs2aafHVAoIBAQCAINy0Lv/BG+qFyLa61EzCLSgSCxcfiV+zVMSOqZbH77HG
MDXwUV7X1JjXhZO9+I/VNX+ERu6fjSAL3zgT0bPKC8Kr5gqusgeF2DNE/K76mNrn
1YhIFQApt9GOUQZLG440ioBudv08d8dFewK4OHd9OmrSCBNSnWiLa1EwsI/eNJab
nm99JVOsmZ9WyK/3RK5hgIHHLqabEeOjOoEJzdS3KblGE4fbMAm469bT4taF1vjk
ApJ+hWO/HGk1eFJfBeaIeF3gvbG51nVEyRyAFPDcJX+FHVaBv0ptbBRRYylmrv7j
AwLYR+xbGx+HmQxg1PVBFfD7T0W66WDZbj9TtJIlAoIBAGl/t/yhlMN7PRlexiVN
LGC30Sn6b7qoi5dTeg0H1piVaqLKEkk0OK5OyzVmEf6Ef6r7NHo/h6XX5QmLYabm
I24bBANfnZiULTvuecbSYqtvjrskgiSGdqc49VU5WJ53VVUnR1pc5H73i821r4i3
joO3HpqDOFiUvO13uxLQdOxHq4/7WWpsmlzmDBJkTReTJGyjGFt6skwGf6uR3zHa
VGngZaBn0B9hsJkBHFkrGzimSu7P+QQ/96OukoT01yzW4C+My7xOlUPhU3sPdLnY
wYweqZsPaAhwoyqaqpZp5V3upJRcFDFaqZzl2CSjNRC9XMHa79jGeFJJduSPWsGK
Zr0CggEAX+GyHg7m1Y2lhz3kpd3NmHskU2P2vlUMGBkjtw2eNpptzawaN4KK58Lv
kzkLgkEJAW+wBt4/RP1UPLontxuhKFD2xkMgcspfk6LBRMg6yjg7mWkwSLOc3Eut
Ixs15zmtOA0QtxoGVGf9PFq//gm6D4OsCTyzdLOuv0Rad+tqvnj2X2YHmbIv74Im
1rRGTBxjBTWCuA/tu8SfmTbRoW+m2yyYH1x64stZ9RnKm3ZbSl8t0XuBhatPUEDZ
z/ulAh9giw2wyTLQN7+efqm23U7OjBT+nZyCNR3ZklfjPUhjVqLBZLmv2HMnZ2rn
l3cIaXejBoibTshTLrn5ouVuR0gmPw==
-----END PRIVATE KEY-----";

    openssl_private_decrypt(base64_decode($msg),$decrypted,$key);//私钥解密
    return $decrypted;
}

//------------------------------------

function distanceBase($latitude, $longitude)
{
    $data = "
        ROUND(
            6378.138 * 2 * ASIN(
                SQRT(
                    POW(
                        SIN(
                            (" . $latitude . " * PI() / 180 - latitude * PI() / 180) / 2
                        ), 2
                    ) + COS (" . $latitude . " * PI() / 180) * COS(latitude * PI() / 180) * POW(
                        SIN(
                            (" . $longitude . " * PI() / 180 - longitude * PI() / 180) / 2
                        ), 2
                    )
                )
            ) * 1000
        ) AS distance";

    return $data;
}

function getrand($proArr)
{
    $arr = [];
    $result = array();
    foreach ($proArr as $key => $val) {
        $arr[$key] = $val['v'];
    }
    if ($arr) {
        $proSum = array_sum($arr);      // 计算总权重
        $randNum = mt_rand(1, $proSum);
        $d1 = 0;
        $d2 = 0;
        for ($i=0; $i < count($arr); $i++)
        {
            $d2 += $arr[$i];
            if($i==0)
            {
                $d1 = 0;
            }
            else
            {
                $d1 += $arr[$i-1];
            }
            if($randNum > $d1 && $randNum <= $d2)
            {
                $result = $proArr[$i];
                break; // 注意这里，当我们已经匹配到奖品时，就应该直接退出循环
            }
        }
        unset ($arr);
        return $result['id'];
    } else {
        return $arr;
    }
}

function countage($birthday)
{
    $year = date('Y');
    $month = date('m');
    if (substr($month, 0, 1) == 0) {
        $month = substr($month, 1);
    }
    $day = date('d');
    if (substr($day, 0, 1) == 0) {
        $day = substr($day, 1);
    }
    $arr = explode('-', $birthday);

    $age = $year - $arr[0];
    if ($month < $arr[1]) {
        $age = $age - 1;

    } elseif ($month == $arr[1] && $day < $arr[2]) {
        $age = $age - 1;

    }

    return $age;
}

function sendcurl($url, $datas, $type=1)
{
    if ($datas) {
        if ($type) {
            $datas = json_decode($datas, true);
            $field = '';
            foreach ($datas as $k => $v) {
                $field .= $k . '=' . urlencode($v) . '&';
            }
            $field = trim($field, '&');
        } else {
            $field = 'data=' . urlencode($datas);
        }
    }

    $curl = curl_init();

    curl_setopt_array($curl, array(
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_POSTFIELDS => $field,
        CURLOPT_HTTPHEADER => array(
            "Content-Type:application/x-www-form-urlencoded"
        ),
    ));

    $response = curl_exec($curl);

    $err = curl_error($curl);

    curl_close($curl);

    if ($err) {
        return ['code' => 400, 'msg' => "cURL Error #:" . $err];
    } else {
        return ['code' => 200, 'data' => $response];
    }
}

function chatUrl()
{
    $request = request();

    $url = $request->domain() . str_replace('/index.php', '', $request->baseFile()) . '/apis/home/privatechat/addtalk?timing=1';

    return $url;
}

function bothDistance($lat1, $lon1, $lat2,$lon2,$radius = 6378.137)
{
    $rad = floatval(M_PI / 180.0);

    $lat1 = floatval($lat1) * $rad;
    $lon1 = floatval($lon1) * $rad;
    $lat2 = floatval($lat2) * $rad;
    $lon2 = floatval($lon2) * $rad;

    $theta = $lon2 - $lon1;

    $dist = acos(sin($lat1) * sin($lat2) + cos($lat1) * cos($lat2) * cos($theta));

    if ($dist < 0 ) {
        $dist += M_PI;
    }
    return $dist = $dist * $radius;
}

function mkFile($file_url, $save_to)
{
    $context = stream_context_create(
        [
            'ssl' => [
                'verify_peer' => false,
            ]
        ]);
    
    if (!@fopen($file_url, "rb", null, $context)) {
        return false;
    }
    
    $in = fopen($file_url, "rb", null, $context);
    
    $out = fopen($save_to, "wb", null, $context);
    while ($chunk = fread($in, 8192)) {
        fwrite($out, $chunk, 8192);
    }
    fclose($in);
    fclose($out);
    
    return true;
}

function changefloor($floor)
{
    return floor(strval($floor * pow(10,2))) / pow(10,2);
}







function is_hasNumber($val){
    $state = false;
    preg_match_all("/\d+/",$val,$arr);
    for ($i=0; $i < sizeof($arr); $i++) { 
        for ($j=0; $j < sizeof($arr[$i]); $j++) {
            if(strlen($arr[$i][$j]) > 0){
                $state = true;
            }
        }
    }
    return $state;
}
function isPhoneNumber($val){
    if(preg_match("/^1[3456789]{1}\d{9}$/",$val)){
        return true;
    }else{
        return false;
    }
}
function ishasPhoneNumber($val){
    $state = false;
    preg_match_all("/\d+/",$val,$arr);
    for ($i=0; $i < sizeof($arr); $i++) { 
        for ($j=0; $j < sizeof($arr[$i]); $j++) {
            if(strlen($arr[$i][$j]) > 10){
                $state = true;
            }
        }
    }
    return $state;
}

function is_hasCnNumber($val){
    $state = false;
    $arr = ["零","壹","貳","叁","肆","伍","陆","柒","捌","玖","拾","一","二","三","四","五","六","七","八","九","十"];
    foreach ($arr as $key => $value) {
        if(strpos($val,$value) !== false)
        {
            $state = true;
            break;
        }else{
            $state = false;
        }
    }
    return $state;
}


function trtcuser($str){
    // $str = "https://cos.ap-guangzhou.myqcloud.com/tianyu-content-moderation-1256924792/segment-/trtc/1400716861/screenshot_11_11_1659430897.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDGCCCHjucduRVwKJE4I-GWxKbHKhYIEBqeNZXoMOvW9NE31S-Apbv43USmFHOWZ79%2F20220802%2Fap-guangzhou%2Fs3%2Faws4_request&X-Amz-Date=20220802T090137Z&X-Amz-Expires=43200&X-Amz-Security-Token=elXNW3xq60H0a33N2kJS9jhixs6tddHa774f09d8982ec19a101d58f59c90c475-V85LtcpTl2OHmnEXeIHtjwg0cWeiDMJ3F-d1Cg9pKd_2uOJcAdpqJeXRa8WDr23QU8eb8iI_zm2tr2DNcROj4tgZkks-52xAawH0FiSEnqIlxx6es7FJxQS2H-kUeNrROMHvwYMbo-eWuGLpCvi0VfH34g3C8JAJcJwztYhFPIxVxBCMya0wbgqAoOV-1yZzluLkL6aW51xlLDXHtN9q2UcPA1i_KiUtqO4DbAfNS91vk4unOs4DXN0h3BTpRh_Uf0L4aijfWafT1SnkRxpbcaPk4B_-5RTuqTa4nF3baY6P-CbvMNkVURen4XawmUInAj0mvragUWFB_kO-uPxMiKHI5j5mkgCqc2tShG7WbE&X-Amz-SignedHeaders=host&X-Amz-Signature=dc7889b68f5c67773714349034959b9580e2fa4e9b4749b256c2bd0e38447daa";
    $idx = strpos($str,"screenshot");
    $str = substr($str,$idx);
    $idx = strpos($str,"?");
    $str = substr($str,0,$idx);
    $str = explode('_', $str);
    return $str[2];
}




function deldir($dir) {
    try {
      //先删除目录下的文件：
      $dh=opendir($dir);
      while ($file=readdir($dh)) {
        if($file!="." && $file!="..") {
          $fullpath=$dir."/".$file;
          if(!is_dir($fullpath)) {
              unlink($fullpath);
          } else {
              deldir($fullpath);
          }
        }
      }
     
      closedir($dh);
      //删除当前文件夹：
      if(rmdir($dir)) {
        return true;
      } else {
        return false;
      }
  } catch (\Exception $e){
    return false;
  }
}

function recycleyqr($phone = '')
{
    if(!$phone) {
        return '';
    }
    $has_recycle = Db::name('recycle_user')->where(['phone' => $phone])->find();
    if($has_recycle){
        try {
            $olddata = json_decode($has_recycle['data'], true);
            $yqr = $olddata['yqr'] ?? '';
            if($yqr){
                $result = Db::name('user')->where(['yqm' => $yqr, 'delete_time' => 0])->find();
                if (!$result) {
                    $yqr = '';
                }
            }
            return $yqr;
        } catch (Exception $e) {
            
        }
    }
    return '';
}

function _getAllUser($uid){
    $item = Db::name('user_repeat_check')->where(['user_id'=>$uid])->find();
    if($item){
        $uids = [$uid];
        $device_ids = explode(',', $item['device_ids']);
        foreach ($device_ids as $key => $value) {
            $where[] = ['exp',Db::raw("FIND_IN_SET('".$value."',device_ids)")];
            $tmp = Db::name('user_repeat_check')->where($where)->column('user_id');
            if(sizeof($tmp)){
                $uids = array_merge($uids, $tmp);
            }
        }
        $uids = array_unique($uids);
        return $uids;
    }else{
        return [$uid];
    }
}



/**
 * 文件地址
 * 协议/域名/文件路径
 *
 * @param string $file_path 文件路径
 * 
 * @return string
 */
function file_url($file_path = '')
{
    if (empty($file_path)) {
        return '';
    }

    if (strpos($file_path, 'http') !== false) {
        return $file_path;
    }

    $server_url = getenv('APP_URL');

    if (stripos($file_path, '/') === 0) {
        $res = $server_url . $file_path;
    } else {
        $res = $server_url . '/' . $file_path;
    }

    return $res;
}
/**
 * 获取当前日期时间
 * format：Y-m-d H:i:s
 *
 * @return string
 */
function datetime()
{
    return date('Y-m-d H:i:s');
}

function delByValue($arr, $value){
  $key = array_search($value,$arr);
  if(isset($key)){
    unset($arr[$key]);
  }
  return $arr;
}
/**
 * http get 请求
 *
 * @param string $url    请求地址
 * @param array  $header 请求头部
 *
 * @return array
 */
function http_get($url, $header = [])
{
    if (empty($header)) {
        $header = [
            "Content-type:application/json;",
            "Accept:application/json"
        ];
    }

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_ENCODING, '');
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
    $response = curl_exec($curl);
    curl_close($curl);
    $response = json_decode($response, true);

    return $response;
}

/**
 * http post 请求
 *
 * @param string $url    请求地址
 * @param array  $param  请求参数
 * @param array  $header 请求头部
 *
 * @return array
 */
function http_post($url, $param = [], $header = [])
{
    $param = json_encode($param);

    if (empty($header)) {
        $header = [
            "Content-type:application/json;charset='utf-8'",
            "Accept:application/json"
        ];
    }

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $param);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    $response = curl_exec($curl);
    curl_close($curl);
    $response = json_decode($response, true);

    return $response;
}
// 发起一个http get请求，并返回请求的结果
// $url字段为请求的地址
// $param字段为请求的参数
function request_get($url = '', $param = array()) {
    if (empty($url) || empty($param)) {
        return false;
    }
    
    $getUrl = $url . "?" . http_build_query($param);
    $curl = curl_init(); // 初始化curl
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查   
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); // 从证书中检查SSL加密算法是否存在
    curl_setopt($curl, CURLOPT_URL, $getUrl); // 抓取指定网页
    curl_setopt($curl, CURLOPT_TIMEOUT, 1000); // 设置超时时间1秒
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // curl不直接输出到屏幕
    curl_setopt($curl, CURLOPT_HEADER, 0); // 设置header
    $data = curl_exec($curl); // 运行curl

    if (!$data) {
        print("an error occured in function request_get(): " . curl_error($curl) . "\n");
    }

    curl_close($curl);
    
    return $data;
}

function _ossUrl($channel = 1)
{
    $arr = ['nihao.oss.meiyue.co', getenv('OSS_DOMAIN')];
    return 'http://' . $arr[$channel] . '/';
}
function _getDateFromIdcard($idcard)
{
    $birthdays = strtotime(strlen($idcard)==15 ? ('19' . substr($idcard, 6, 6)) : substr($idcard, 6, 8));
    return date('Y-m-d', $birthdays);
}
function validateIDCard($idcard) {
    if(empty($idcard)){
        return false;
    }else{
        $idcard = strtoupper($idcard); # 如果是小写x,转化为大写X
        if(strlen($idcard) != 18 && strlen($idcard) != 15){
            return false;
        }
        # 如果是15位身份证，则转化为18位
        if(strlen($idcard) == 15){
            return false;
            
            # 如果身份证顺序码是996 997 998 999，这些是为百岁以上老人的特殊编码 
            if (array_search(substr($idcard, 12, 3), array('996', '997', '998', '999')) !== false) {
                $idcard = substr($idcard, 0, 6) . '18' . substr($idcard, 6, 9);
            } else {
                $idcard = substr($idcard, 0, 6) . '19' . substr($idcard, 6, 9);
            }
            # 加权因子 
            $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
            # 校验码对应值 
            $code = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
            $checksum = 0;
            for ($i = 0; $i < strlen($idcard); $i++) {
                $checksum += substr($idcard, $i, 1) * $factor[$i];
            }
            $idcard = $idcard . $code[$checksum % 11];
        }
        # 验证身份证开始
        $IDCardBody = substr($idcard, 0, 17); # 身份证主体
        $IDCardCode = strtoupper(substr($idcard, 17, 1)); # 身份证最后一位的验证码
        
        # 加权因子 
        $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
        # 校验码对应值 
        $code = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
        $checksum = 0;
        for ($i = 0; $i < strlen($IDCardBody); $i++) {
            $checksum += substr($IDCardBody, $i, 1) * $factor[$i];
        }
        $validateIdcard = $code[$checksum % 11];    # 判断身份证是否合理
        if($validateIdcard != $IDCardCode){
            return false;
        }else{
            return true;
        }
    }
}
function _calculateHotScore($viewCount, $replyCount, $likeCount, $shareCount) {
    $viewWeight = 0.1;
    $replyWeight = 0.5;
    $likeWeight = 0.3;
    $shareWeight = 0.1;
    
    $hotScore = ($viewWeight * $viewCount) + ($replyWeight * $replyCount) + ($likeWeight * $likeCount) + ($shareWeight * $shareCount);
    return $hotScore;
}
function _calculateHotScoreNew($viewCount, $replyCount, $likeCount, $shareCount, $time) {
    $viewWeightIndex = [0, 1, 31, 101, 501];
    $viewWeightValue = [10, 12, 15, 20, 25];

    $replyWeightIndex = [0, 1, 11, 31, 101];
    $replyWeightValue = [10, 12, 15, 20, 25];

    $likeWeightIndex = [0, 1, 11, 51, 201];
    $likeWeightValue = [10, 12, 15, 20, 25];

    $shareWeightIndex = [0, 1, 11, 31, 101];
    $shareWeightValue = [10, 12, 15, 20, 25];

    $viewWeight = 0;
    for ($i=sizeof($viewWeightIndex) - 1; $i >= 0; $i--) {
        if ($viewWeightIndex[$i] <= $viewCount) {
            $viewWeight = $viewWeightValue[$i];
            break;
        }
    }
    
    $replyWeight = 0;
    for ($i=sizeof($replyWeightIndex) - 1; $i >= 0; $i--) {
        if ($replyWeightIndex[$i] <= $replyCount) {
            $replyWeight = $replyWeightValue[$i];
            break;
        }
    }
    
    $likeWeight = 0;
    for ($i=sizeof($likeWeightIndex) - 1; $i >= 0; $i--) {
        if ($likeWeightIndex[$i] <= $likeCount) {
            $likeWeight = $likeWeightValue[$i];
            break;
        }
    }
    
    $shareWeight = 0;
    for ($i=sizeof($shareWeightIndex) - 1; $i >= 0; $i--) {
        if ($shareWeightIndex[$i] <= $shareCount) {
            $shareWeight = $shareWeightValue[$i];
            break;
        }
    }

    $timenow = time();

    $timeWeightIndex = [1, 2, 8, 31, 91];
    $timeWeightValue = [300, 20, 15, 12, 10];
    $timeWeight = 0;
    for ($i=sizeof($timeWeightIndex) - 1; $i >= 0; $i--) {
        if ($timeWeightIndex[$i] <= ceil(($timenow - strtotime($time)) / 86400)) {
            $timeWeight = $timeWeightValue[$i];
            break;
        }
    }

    $hotScore = $viewWeight + $replyWeight + $likeWeight + $shareWeight + $timeWeight;
    return $hotScore;
}
function _toTree($category = [], $category_pid = 0, $key = 'tid', $ckey = 'children') {
    $tree = [];
    foreach ($category as $v) {
        if ($v[$key] == $category_pid) {
            $v[$ckey] = _toTree($category, $v['id'], $key, $ckey);
            $tree[] = $v;
        }
    }
    return $tree;
}

/**
 * @param int $type 1生成昵称，2生成姓名
 * //汉语 - 给用户自动生成昵称
 */
function _nickname($type = 1){ 
   
    /**
     * 随机昵称 形容词
     */
    $nicheng_tou=['迷你的','鲜艳的','飞快的','真实的','清新的','幸福的','可耐的','快乐的','冷静的','醉熏的','潇洒的','糊涂的','积极的','冷酷的','深情的','粗暴的',
        '温柔的','可爱的','愉快的','义气的','认真的','威武的','帅气的','传统的','潇洒的','漂亮的','自然的','专一的','听话的','昏睡的','狂野的','等待的','搞怪的',
        '幽默的','魁梧的','活泼的','开心的','高兴的','超帅的','留胡子的','坦率的','直率的','轻松的','痴情的','完美的','精明的','无聊的','有魅力的','丰富的','繁荣的',
        '饱满的','炙热的','暴躁的','碧蓝的','俊逸的','英勇的','健忘的','故意的','无心的','土豪的','朴实的','兴奋的','幸福的','淡定的','不安的','阔达的','孤独的',
        '独特的','疯狂的','时尚的','落后的','风趣的','忧伤的','大胆的','爱笑的','矮小的','健康的','合适的','玩命的','沉默的','斯文的','香蕉','苹果','鲤鱼','鳗鱼',
        '任性的','细心的','粗心的','大意的','甜甜的','酷酷的','健壮的','英俊的','霸气的','阳光的','默默的','大力的','孝顺的','忧虑的','着急的','紧张的','善良的',
        '凶狠的','害怕的','重要的','危机的','欢喜的','欣慰的','满意的','跳跃的','诚心的','称心的','如意的','怡然的','娇气的','无奈的','无语的','激动的','愤怒的',
        '美好的','感动的','激情的','激昂的','震动的','虚拟的','超级的','寒冷的','精明的','明理的','犹豫的','忧郁的','寂寞的','奋斗的','勤奋的','现代的','过时的',
        '稳重的','热情的','含蓄的','开放的','无辜的','多情的','纯真的','拉长的','热心的','从容的','体贴的','风中的','曾经的','追寻的','儒雅的','优雅的','开朗的',
        '外向的','内向的','清爽的','文艺的','长情的','平常的','单身的','伶俐的','高大的','懦弱的','柔弱的','爱笑的','乐观的','耍酷的','酷炫的','神勇的','年轻的',
        '唠叨的','瘦瘦的','无情的','包容的','顺心的','畅快的','舒适的','靓丽的','负责的','背后的','简单的','谦让的','彩色的','缥缈的','欢呼的','生动的','复杂的',
        '慈祥的','仁爱的','魔幻的','虚幻的','淡然的','受伤的','雪白的','高高的','糟糕的','顺利的','闪闪的','羞涩的','缓慢的','迅速的','优秀的','聪明的','含糊的',
        '俏皮的','淡淡的','坚强的','平淡的','欣喜的','能干的','灵巧的','友好的','机智的','机灵的','正直的','谨慎的','俭朴的','殷勤的','虚心的','辛勤的','自觉的',
        '无私的','无限的','踏实的','老实的','现实的','可靠的','务实的','拼搏的','个性的','粗犷的','活力的','成就的','勤劳的','单纯的','落寞的','朴素的','悲凉的',
        '忧心的','洁净的','清秀的','自由的','小巧的','单薄的','贪玩的','刻苦的','干净的','壮观的','和谐的','文静的','调皮的','害羞的','安详的','自信的','端庄的',
        '坚定的','美满的','舒心的','温暖的','专注的','勤恳的','美丽的','腼腆的','优美的','甜美的','甜蜜的','整齐的','动人的','典雅的','尊敬的','舒服的','妩媚的',
        '秀丽的','喜悦的','甜美的','彪壮的','强健的','大方的','俊秀的','聪慧的','迷人的','陶醉的','悦耳的','动听的','明亮的','结实的','魁梧的','标致的','清脆的',
        '敏感的','光亮的','大气的','老迟到的','知性的','冷傲的','呆萌的','野性的','隐形的','笑点低的','微笑的','笨笨的','难过的','沉静的','火星上的','失眠的',
        '安静的','纯情的','要减肥的','迷路的','烂漫的','哭泣的','贤惠的','苗条的','温婉的','发嗲的','会撒娇的','贪玩的','执着的','眯眯眼的','花痴的','想人陪的',
        '眼睛大的','高贵的','傲娇的','心灵美的','爱撒娇的','细腻的','天真的','怕黑的','感性的','飘逸的','怕孤独的','忐忑的','高挑的','傻傻的','冷艳的','爱听歌的',
        '还单身的','怕孤单的','懵懂的'];
    $nicheng_wei=['嚓茶','皮皮虾','皮卡丘','马里奥','小霸王','凉面','便当','毛豆','花生','可乐','灯泡','哈密瓜','野狼','背包','眼神','缘分','雪碧','人生','牛排',
        '蚂蚁','飞鸟','灰狼','斑马','汉堡','悟空','巨人','绿茶','自行车','保温杯','大碗','墨镜','魔镜','煎饼','月饼','月亮','星星','芝麻','啤酒','玫瑰',
        '大叔','小伙','哈密瓜，数据线','太阳','树叶','芹菜','黄蜂','蜜粉','蜜蜂','信封','西装','外套','裙子','大象','猫咪','母鸡','路灯','蓝天','白云',
        '星月','彩虹','微笑','摩托','板栗','高山','大地','大树','电灯胆','砖头','楼房','水池','鸡翅','蜻蜓','红牛','咖啡','机器猫','枕头','大船','诺言',
        '钢笔','刺猬','天空','飞机','大炮','冬天','洋葱','春天','夏天','秋天','冬日','航空','毛衣','豌豆','黑米','玉米','眼睛','老鼠','白羊','帅哥','美女',
        '季节','鲜花','服饰','裙子','白开水','秀发','大山','火车','汽车','歌曲','舞蹈','老师','导师','方盒','大米','麦片','水杯','水壶','手套','鞋子','自行车',
        '鼠标','手机','电脑','书本','奇迹','身影','香烟','夕阳','台灯','宝贝','未来','皮带','钥匙','心锁','故事','花瓣','滑板','画笔','画板','学姐','店员',
        '电源','饼干','宝马','过客','大白','时光','石头','钻石','河马','犀牛','西牛','绿草','抽屉','柜子','往事','寒风','路人','橘子','耳机','鸵鸟','朋友',
        '苗条','铅笔','钢笔','硬币','热狗','大侠','御姐','萝莉','毛巾','期待','盼望','白昼','黑夜','大门','黑裤','钢铁侠','哑铃','板凳','枫叶','荷花','乌龟',
        '仙人掌','衬衫','大神','草丛','早晨','心情','茉莉','流沙','蜗牛','战斗机','冥王星','猎豹','棒球','篮球','乐曲','电话','网络','世界','中心','鱼','鸡','狗',
        '老虎','鸭子','雨','羽毛','翅膀','外套','火','丝袜','书包','钢笔','冷风','八宝粥','烤鸡','大雁','音响','招牌','胡萝卜','冰棍','帽子','菠萝','蛋挞','香水',
        '泥猴桃','吐司','溪流','黄豆','樱桃','小鸽子','小蝴蝶','爆米花','花卷','小鸭子','小海豚','日记本','小熊猫','小懒猪','小懒虫','荔枝','镜子','曲奇','金针菇',
        '小松鼠','小虾米','酒窝','紫菜','金鱼','柚子','果汁','百褶裙','项链','帆布鞋','火龙果','奇异果','煎蛋','唇彩','小土豆','高跟鞋','戒指','雪糕','睫毛','铃铛',
        '手链','香氛','红酒','月光','酸奶','银耳汤','咖啡豆','小蜜蜂','小蚂蚁','蜡烛','棉花糖','向日葵','水蜜桃','小蝴蝶','小刺猬','小丸子','指甲油','康乃馨','糖豆',
        '薯片','口红','超短裙','乌冬面','冰淇淋','棒棒糖','长颈鹿','豆芽','发箍','发卡','发夹','发带','铃铛','小馒头','小笼包','小甜瓜','冬瓜','香菇','小兔子',
        '含羞草','短靴','睫毛膏','小蘑菇','跳跳糖','小白菜','草莓','柠檬','月饼','百合','纸鹤','小天鹅','云朵','芒果','面包','海燕','小猫咪','龙猫','唇膏','鞋垫',
        '羊','黑猫','白猫','万宝路','金毛','山水','音响','纸飞机','烧鹅'];
    /**
     * 百家姓
     */
    $arrXing=['赵','钱','孙','李','周','吴','郑','王','冯','陈','褚','卫','蒋','沈','韩','杨','朱','秦','尤','许','何','吕','施','张','孔','曹','严','华','金','魏','陶','姜','戚','谢','邹',
        '喻','柏','水','窦','章','云','苏','潘','葛','奚','范','彭','郎','鲁','韦','昌','马','苗','凤','花','方','任','袁','柳','鲍','史','唐','费','薛','雷','贺','倪','汤','滕','殷','罗',
        '毕','郝','安','常','傅','卞','齐','元','顾','孟','平','黄','穆','萧','尹','姚','邵','湛','汪','祁','毛','狄','米','伏','成','戴','谈','宋','茅','庞','熊','纪','舒','屈','项','祝',
        '董','梁','杜','阮','蓝','闵','季','贾','路','娄','江','童','颜','郭','梅','盛','林','钟','徐','邱','骆','高','夏','蔡','田','樊','胡','凌','霍','虞','万','支','柯','管','卢','莫',
        '柯','房','裘','缪','解','应','宗','丁','宣','邓','单','杭','洪','包','诸','左','石','崔','吉','龚','程','嵇','邢','裴','陆','荣','翁','荀','于','惠','甄','曲','封','储','仲','伊',
        '宁','仇','甘','武','符','刘','景','詹','龙','叶','幸','司','黎','溥','印','怀','蒲','邰','从','索','赖','卓','屠','池','乔','胥','闻','莘','党','翟','谭','贡','劳','逄','姬','申',
        '扶','堵','冉','宰','雍','桑','寿','通','燕','浦','尚','农','温','别','庄','晏','柴','瞿','阎','连','习','容','向','古','易','廖','庾','终','步','都','耿','满','弘','匡','国','文',
        '寇','广','禄','阙','东','欧','利','师','巩','聂','关','荆','司马','上官','欧阳','夏侯','诸葛','闻人','东方','赫连','皇甫','尉迟','公羊','澹台','公冶','宗政','濮阳','淳于','单于','太叔',
        '申屠','公孙','仲孙','轩辕','令狐','徐离','宇文','长孙','慕容','司徒','司空','皮'];
    /**
     * 名
     */
    $arrMing=['伟','刚','勇','毅','俊','峰','强','军','平','保','东','文','辉','力','明','永','健','世','广','志','义','兴','良','海','山','仁','波','宁','贵','福','生','龙','元','全'
        ,'国','胜','学','祥','才','发','武','新','利','清','飞','彬','富','顺','信','子','杰','涛','昌','成','康','星','光','天','达','安','岩','中','茂','进','林','有','坚','和','彪','博','诚'
        ,'先','敬','震','振','壮','会','思','群','豪','心','邦','承','乐','绍','功','松','善','厚','庆','磊','民','友','裕','河','哲','江','超','浩','亮','政','谦','亨','奇','固','之','轮','翰'
        ,'朗','伯','宏','言','若','鸣','朋','斌','梁','栋','维','启','克','伦','翔','旭','鹏','泽','晨','辰','士','以','建','家','致','树','炎','德','行','时','泰','盛','雄','琛','钧','冠','策'
        ,'腾','楠','榕','风','航','弘','秀','娟','英','华','慧','巧','美','娜','静','淑','惠','珠','翠','雅','芝','玉','萍','红','娥','玲','芬','芳','燕','彩','春','菊','兰','凤','洁','梅','琳'
        ,'素','云','莲','真','环','雪','荣','爱','妹','霞','香','月','莺','媛','艳','瑞','凡','佳','嘉','琼','勤','珍','贞','莉','桂','娣','叶','璧','璐','娅','琦','晶','妍','茜','秋','珊','莎'
        ,'锦','黛','青','倩','婷','姣','婉','娴','瑾','颖','露','瑶','怡','婵','雁','蓓','纨','仪','荷','丹','蓉','眉','君','琴','蕊','薇','菁','梦','岚','苑','婕','馨','瑗','琰','韵','融','园'
        ,'艺','咏','卿','聪','澜','纯','毓','悦','昭','冰','爽','琬','茗','羽','希','欣','飘','育','滢','馥','筠','柔','竹','霭','凝','晓','欢','霄','枫','芸','菲','寒','伊','亚','宜','可','姬'
        ,'舒','影','荔','枝','丽','阳','妮','宝','贝','初','程','梵','罡','恒','鸿','桦','骅','剑','娇','纪','宽','苛','灵','玛','媚','琪','晴','容','睿','烁','堂','唯','威','韦','雯','苇','萱'
        ,'阅','彦','宇','雨','洋','忠','宗','曼','紫','逸','贤','蝶','菡','绿','蓝','儿','翠','烟'];
    switch ($type){ 
   
        case 1:
            $tou_num=rand(0,count($nicheng_tou)-1);
            $wei_num=rand(0,count($nicheng_wei)-1);
            $nicheng=$nicheng_tou[$tou_num].$nicheng_wei[$wei_num];
        case 2:
            $nicheng=$arrXing[mt_rand(0,count($arrXing)-1)];
            for($i=1;$i<=3;$i++)
            { 
   
                $nicheng .=(mt_rand(0,1)?$arrMing[mt_rand(0,count($arrMing)-1)]:$arrMing[mt_rand(0,count($arrMing)-1)]);
            }
    }
    return $nicheng;
}

 
function _nickname2()
{
    $randomXing = array('快乐', '冷静', '醉熏', '潇洒', '糊涂', '积极', '冷酷', '深情', '粗暴', '温柔', '可爱', '愉快', '义气', '认真', '威武', '帅气', '传统', '潇洒', '漂亮', '自然', '专一', '听话', '昏睡', '狂野', '等待', '搞怪', '幽默', '魁梧', '活泼', '开心', '高兴', '超帅', '留胡子', '坦率', '直率', '轻松', '痴情', '完美', '精明', '无聊', '有魅力', '丰富', '繁荣', '饱满', '炙热', '暴躁', '碧蓝', '俊逸', '英勇', '健忘', '故意', '无心', '土豪', '朴实', '兴奋', '幸福', '淡定', '不安', '阔达', '孤独', '独特', '疯狂', '时尚', '落后', '风趣', '忧伤', '大胆', '爱笑', '矮小', '健康', '合适', '玩命', '沉默', '斯文', '香蕉', '苹果', '鲤鱼', '鳗鱼', '任性', '细心', '粗心', '大意', '甜甜', '酷酷', '健壮', '英俊', '霸气', '阳光', '默默', '大力', '孝顺', '忧虑', '着急', '紧张', '善良', '凶狠', '害怕', '重要', '危机', '欢喜', '欣慰', '满意', '跳跃', '诚心', '称心', '如意', '怡然', '娇气', '无奈', '无语', '激动', '愤怒', '美好', '感动', '激情', '激昂', '震动', '虚拟', '超级', '寒冷', '精明', '明理', '犹豫', '忧郁', '寂寞', '奋斗', '勤奋', '现代', '过时', '稳重', '热情', '含蓄', '开放', '无辜', '多情', '纯真', '拉长', '热心', '从容', '体贴', '风中', '曾经', '追寻', '儒雅', '优雅', '开朗', '外向', '内向', '清爽', '文艺', '长情', '平常', '单身', '伶俐', '高大', '懦弱', '柔弱', '爱笑', '乐观', '耍酷', '酷炫', '神勇', '年轻', '唠叨', '瘦瘦', '无情', '包容', '顺心', '畅快', '舒适', '靓丽', '负责', '背后', '简单', '谦让', '彩色', '缥缈', '欢呼的', '生动的', '复杂的', '慈祥的', '仁爱', '魔幻', '虚幻', '淡然', '受伤', '雪白', '高高', '糟糕', '顺利', '闪闪', '羞涩', '缓慢', '迅速', '优秀', '聪明', '含糊', '俏皮', '淡淡', '坚强', '平淡', '欣喜', '能干', '灵巧', '友好', '机智', '机灵', '正直', '谨慎', '俭朴', '殷勤', '虚心', '辛勤', '自觉', '无私', '无限', '踏实', '老实', '现实', '可靠', '务实', '拼搏', '个性', '粗犷', '活力', '成就', '勤劳', '单纯', '落寞', '朴素', '悲凉', '忧心', '洁净', '清秀', '自由', '小巧', '单薄', '贪玩', '刻苦', '干净', '壮观', '和谐', '文静', '调皮', '害羞', '安详', '自信', '端庄', '坚定', '美满', '舒心', '温暖', '专注', '勤恳', '美丽', '腼腆', '优美', '甜美', '甜蜜', '整齐', '动人', '典雅', '尊敬', '舒服', '妩媚', '秀丽', '喜悦', '甜美', '彪壮', '强健', '大方', '俊秀', '聪慧', '迷人', '陶醉', '悦耳', '动听', '明亮', '结实', '魁梧', '标致', '清脆', '敏感', '光亮', '大气', '老迟到', '知性', '冷傲', '呆萌', '野性', '隐形', '笑点低', '微笑', '笨笨', '难过', '沉静', '火星上', '失眠', '安静', '纯情', '要减肥', '迷路', '烂漫', '哭泣', '贤惠', '苗条', '温婉', '发嗲', '会撒娇', '贪玩', '执着', '眯眯眼', '花痴', '想人陪', '眼睛大', '高贵', '傲娇', '心灵美', '爱撒娇', '细腻', '天真', '怕黑', '感性', '飘逸', '怕孤独', '忐忑', '高挑', '傻傻', '冷艳', '爱听歌', '还单身', '怕孤单', '懵懂');
 
    $randomMing = array('嚓茶', '凉面', '便当', '毛豆', '花生', '可乐', '灯泡', '哈密瓜', '野狼', '背包', '眼神', '缘分', '雪碧', '人生', '牛排', '蚂蚁', '飞鸟', '灰狼', '斑马', '汉堡', '悟空', '巨人', '绿茶', '自行车', '保温杯', '大碗', '墨镜', '魔镜', '煎饼', '月饼', '月亮', '星星', '芝麻', '啤酒', '玫瑰', '大叔', '小伙', '哈密瓜，数据线', '太阳', '树叶', '芹菜', '黄蜂', '蜜粉', '蜜蜂', '信封', '西装', '外套', '裙子', '大象', '猫咪', '母鸡', '路灯', '蓝天', '白云', '星月', '彩虹', '微笑', '摩托', '板栗', '高山', '大地', '大树', '电灯胆', '砖头', '楼房', '水池', '鸡翅', '蜻蜓', '红牛', '咖啡', '机器猫', '枕头', '大船', '诺言', '钢笔', '刺猬', '天空', '飞机', '大炮', '冬天', '洋葱', '春天', '夏天', '秋天', '冬日', '航空', '毛衣', '豌豆', '黑米', '玉米', '眼睛', '老鼠', '白羊', '帅哥', '美女', '季节', '鲜花', '服饰', '裙子', '白开水', '秀发', '大山', '火车', '汽车', '歌曲', '舞蹈', '老师', '导师', '方盒', '大米', '麦片', '水杯', '水壶', '手套', '鞋子', '自行车', '鼠标', '手机', '电脑', '书本', '奇迹', '身影', '香烟', '夕阳', '台灯', '宝贝', '未来', '皮带', '钥匙', '心锁', '故事', '花瓣', '滑板', '画笔', '画板', '学姐', '店员', '电源', '饼干', '宝马', '过客', '大白', '时光', '石头', '钻石', '河马', '犀牛', '西牛', '绿草', '抽屉', '柜子', '往事', '寒风', '路人', '橘子', '耳机', '鸵鸟', '朋友', '苗条', '铅笔', '钢笔', '硬币', '热狗', '大侠', '御姐', '萝莉', '毛巾', '期待', '盼望', '白昼', '黑夜', '大门', '黑裤', '钢铁侠', '哑铃', '板凳', '枫叶', '荷花', '乌龟', '仙人掌', '衬衫', '大神', '草丛', '早晨', '心情', '茉莉', '流沙', '蜗牛', '战斗机', '冥王星', '猎豹', '棒球', '篮球', '乐曲', '电话', '网络', '世界', '中心', '鱼', '鸡', '狗', '老虎', '鸭子', '雨', '羽毛', '翅膀', '外套', '火', '丝袜', '书包', '钢笔', '冷风', '八宝粥', '烤鸡', '大雁', '音响', '招牌', '胡萝卜', '冰棍', '帽子', '菠萝', '蛋挞', '香水', '泥猴桃', '吐司', '溪流', '黄豆', '樱桃', '小鸽子', '小蝴蝶', '爆米花', '花卷', '小鸭子', '小海豚', '日记本', '小熊猫', '小懒猪', '小懒虫', '荔枝', '镜子', '曲奇', '金针菇', '小松鼠', '小虾米', '酒窝', '紫菜', '金鱼', '柚子', '果汁', '百褶裙', '项链', '帆布鞋', '火龙果', '奇异果', '煎蛋', '唇彩', '小土豆', '高跟鞋', '戒指', '雪糕', '睫毛', '铃铛', '手链', '香氛', '红酒', '月光', '酸奶', '银耳汤', '咖啡豆', '小蜜蜂', '小蚂蚁', '蜡烛', '棉花糖', '向日葵', '水蜜桃', '小蝴蝶', '小刺猬', '小丸子', '指甲油', '康乃馨', '糖豆', '薯片', '口红', '超短裙', '乌冬面', '冰淇淋', '棒棒糖', '长颈鹿', '豆芽', '发箍', '发卡', '发夹', '发带', '铃铛', '小馒头', '小笼包', '小甜瓜', '冬瓜', '香菇', '小兔子', '含羞草', '短靴', '睫毛膏', '小蘑菇', '跳跳糖', '小白菜', '草莓', '柠檬', '月饼', '百合', '纸鹤', '小天鹅', '云朵', '芒果', '面包', '海燕', '小猫咪', '龙猫', '唇膏', '鞋垫', '羊', '黑猫', '白猫', '万宝路', '金毛', '山水', '音响');
 
    if (rand(0,1)) {
        $nicName = $randomMing[rand(0, count($randomMing) - 1)] . $randomXing[rand(0, count($randomXing) - 1)];
    } else {
        $nicName = $randomXing[rand(0, count($randomXing) - 1)] . $randomMing[rand(0, count($randomMing) - 1)];
    }
 
    return $nicName; // 返回生成的昵称
}


function getUserAgent($user_agent = ''){
    if (!$user_agent) {
        $user_agent = $_SERVER['HTTP_USER_AGENT'];
    }
    // 判断是否为iOS设备
    $is_ios = preg_match('/(iPhone|iPad|iPod)/', $user_agent);
    // 判断是否为安卓设备
    $is_android = preg_match('/Android/', $user_agent);
    if ($is_ios) {
    /*    echo "这是iOS手机";*/
        return  'ios';
    } elseif ($is_android) {
        /*echo "这是安卓手机";*/
        return  'android';
    } else {
     /*   echo "无法识别设备类型";*/
        return  'other';
    }
}
function downloadFile($imageUrl, $savePath = '', $key = 'images') {
    if (!$savePath) {
        $savePath = '/disk/uploads/download/'.$key.'/' . date('Ym') . '/' . date('d') . '/' . date('H') . '/';
    }
    // 检查保存路径是否存在，不存在则创建
    if (!file_exists(ROOT_PATH . $savePath)) {
        mkdir(ROOT_PATH . $savePath, 0777, true);
    }
    try {
        // 获取图片扩展名
        $ext = pathinfo($imageUrl, PATHINFO_EXTENSION);
        $exts = explode('?', $ext);
        if (sizeof($exts) > 1) {
            $ext = $exts[0];
        }
        if (!$ext) {
            throw new Exception("undefine ext", 1);
        }
        $formats = [
            "JPG",
            "JPEG",
            "PNG",
            "GIF",
            // 视频格式
            "MP4",
            "AVI",
            "WMV",
            "MOV",
            "FLV",
            
            // 音频格式
            "MP3",
            "WAV",
            "AAC",
            "WMA",
            
            // 文本格式
            "TXT",
            "HTML",
            "PDF",
            "DOCX"
        ];
        if (!in_array(strtoupper($ext), $formats)) {
            throw new Exception("undefine ext", 2);
        }

    } catch (\Exception $e) {
        $keytoexts = ['images'=>'png', 'videos'=>'mp4'];
        $ext = $keytoexts[$key];
    }
    // 生成随机文件名
    $filename = uniqid() . '.' . $ext;
    // 拼接保存文件的完整路径
    $filePath = $savePath . $filename;
    // 打开远程图片
    $imageContent = file_get_contents($imageUrl);
    // 将远程图片保存到本地
    file_put_contents(ROOT_PATH . $filePath, $imageContent);
    // 返回保存后的文件路径
    return $filePath;
}

function base64EncodeImage ($image_file) {
    $base64_image = '';
    $image_info = getimagesize($image_file);
    $image_data = fread(fopen($image_file, 'r'), filesize($image_file));
    $base64_image = 'data:' . $image_info['mime'] . ';base64,' . chunk_split(base64_encode($image_data));
    return $base64_image;
}

function _rabbitMqPublish($name, $data, $multiple = false)
{
    if (!getenv('AMQP_EN')) return false;
    action('rabbitmq/MqProducer/publish', ['data' => $data, 'name' => $name, 'multiple' => $multiple]);
}


function _convertRelativeTimeToDatetimeWithOffset($relativeTime) {
    $timeString = '';
    $baseTime = time(); // 当前时间的 Unix 时间戳

    if (strpos($relativeTime, '天前') !== false) {
        $daysAgo = (int)trim($relativeTime, '天前');
        $randomOffset = rand(1, 24 * 3600); // 1到24小时的随机偏移量
        $timeString = date('Y-m-d H:i:s', strtotime("-$daysAgo day", $baseTime) + $randomOffset);
    } elseif (strpos($relativeTime, '个小时前') !== false) {
        $hoursAgo = (int)trim($relativeTime, '个小时前');
        $randomOffset = rand(1, 3600); // 1到60分钟的随机偏移量
        $timeString = date('Y-m-d H:i:s', strtotime("-$hoursAgo hour", $baseTime) + $randomOffset);
    } else {
        // Handle other cases or return current time
        $timeString = date('Y-m-d H:i:s');
    }
    return $timeString;
}

function deleteDirectory($dir) {
    if (!is_dir($dir)) {
        return false;
    }
    
    $files = array_diff(scandir($dir), array('.', '..'));
    
    foreach ($files as $file) {
        (is_dir("$dir/$file")) ? deleteDirectory("$dir/$file") : unlink("$dir/$file");
    }
    
    return rmdir($dir);
}
function _msgtype($content, $channel)
{
    switch ($channel) {
        case 1:
            $content = '[图片]';
            break;
        case 2:
            $content = '[语音]';
            break;
        case 3:
            $content = '[视频]';
            break;
        case 8:
        case 18:
            $content = '[礼物]';
            break;
        case 9:
            $content = '[语音通话]';
            break;
        case 10:
            $content = '[视频通话]';
            break;
        case 11:
        case 17:
            $content = '[表情]';
            break;
        case 19:
            $content = '[商品代付]请你帮我付个款吧';
            break;
    }
    return $content;
}


function suiji2($type = 1)
{
    /**
     * 随机昵称 形容词
     */
    $nicheng_tou = ['迷你', '鲜艳', '飞快', '真实', '清新', '幸福', '可耐', '快乐', '冷静', '醉熏', '潇洒', '糊涂', '积极', '冷酷', '深情', '粗暴',
        '温柔', '可爱', '愉快', '义气', '认真', '威武', '帅气', '传统', '潇洒', '漂亮', '自然', '专一', '听话', '昏睡', '狂野', '等待', '搞怪',
        '幽默', '魁梧', '活泼', '开心', '高兴', '超帅', '留胡子', '坦率', '直率', '轻松', '痴情', '完美', '精明', '无聊', '有魅力', '丰富', '繁荣',
        '饱满', '炙热', '暴躁', '碧蓝', '俊逸', '英勇', '健忘', '故意', '无心', '土豪', '朴实', '兴奋', '幸福', '淡定', '不安', '阔达', '孤独',
        '独特', '疯狂', '时尚', '落后', '风趣', '忧伤', '大胆', '爱笑', '矮小', '健康', '合适', '玩命', '沉默', '斯文', '香蕉', '苹果', '鲤鱼', '鳗鱼',
        '任性', '细心', '粗心', '大意', '甜甜', '酷酷', '健壮', '英俊', '霸气', '阳光', '默默', '大力', '孝顺', '忧虑', '着急', '紧张', '善良',
        '凶狠', '害怕', '重要', '危机', '欢喜', '欣慰', '满意', '跳跃', '诚心', '称心', '如意', '怡然', '娇气', '无奈', '无语', '激动', '愤怒',
        '美好', '感动', '激情', '激昂', '震动', '虚拟', '超级', '寒冷', '精明', '明理', '犹豫', '忧郁', '寂寞', '奋斗', '勤奋', '现代', '过时',
        '稳重', '热情', '含蓄', '开放', '无辜', '多情', '纯真', '拉长', '热心', '从容', '体贴', '风中', '曾经', '追寻', '儒雅', '优雅', '开朗',
        '外向', '内向', '清爽', '文艺', '长情', '平常', '单身', '伶俐', '高大', '懦弱', '柔弱', '爱笑', '乐观', '耍酷', '酷炫', '神勇', '年轻',
        '唠叨', '瘦瘦', '无情', '包容', '顺心', '畅快', '舒适', '靓丽', '负责', '背后', '简单', '谦让', '彩色', '缥缈', '欢呼', '生动', '复杂',
        '慈祥', '仁爱', '魔幻', '虚幻', '淡然', '受伤', '雪白', '高高', '糟糕', '顺利', '闪闪', '羞涩', '缓慢', '迅速', '优秀', '聪明', '含糊',
        '俏皮', '淡淡', '坚强', '平淡', '欣喜', '能干', '灵巧', '友好', '机智', '机灵', '正直', '谨慎', '俭朴', '殷勤', '虚心', '辛勤', '自觉',
        '无私', '无限', '踏实', '老实', '现实', '可靠', '务实', '拼搏', '个性', '粗犷', '活力', '成就', '勤劳', '单纯', '落寞', '朴素', '悲凉',
        '忧心', '洁净', '清秀', '自由', '小巧', '单薄', '贪玩', '刻苦', '干净', '壮观', '和谐', '文静', '调皮', '害羞', '安详', '自信', '端庄',
        '坚定', '美满', '舒心', '温暖', '专注', '勤恳', '美丽', '腼腆', '优美', '甜美', '甜蜜', '整齐', '动人', '典雅', '尊敬', '舒服', '妩媚',
        '秀丽', '喜悦', '甜美', '彪壮', '强健', '大方', '俊秀', '聪慧', '迷人', '陶醉', '悦耳', '动听', '明亮', '结实', '魁梧', '标致', '清脆',
        '敏感', '光亮', '大气', '老迟到', '知性', '冷傲', '呆萌', '野性', '隐形', '笑点低', '微笑', '笨笨', '难过', '沉静', '火星上', '失眠',
        '安静', '纯情', '要减肥', '迷路', '烂漫', '哭泣', '贤惠', '苗条', '温婉', '发嗲', '会撒娇', '贪玩', '执着', '眯眯眼', '花痴', '想人陪',
        '眼睛大', '高贵', '傲娇', '心灵美', '爱撒娇', '细腻', '天真', '怕黑', '感性', '飘逸', '怕孤独', '忐忑', '高挑', '傻傻', '冷艳', '爱听歌',
        '还单身的', '怕孤单的', '懵懂的'];
    $nicheng_wei = ['嚓茶', '皮皮虾', '皮卡丘', '马里奥', '小霸王', '凉面', '便当', '毛豆', '花生', '可乐', '灯泡', '哈密瓜', '野狼', '背包', '眼神', '缘分', '雪碧', '人生', '牛排',
        '蚂蚁', '飞鸟', '灰狼', '斑马', '汉堡', '悟空', '巨人', '绿茶', '自行车', '保温杯', '大碗', '墨镜', '魔镜', '煎饼', '月饼', '月亮', '星星', '芝麻', '啤酒', '玫瑰',
        '大叔', '小伙', '哈密瓜，数据线', '太阳', '树叶', '芹菜', '黄蜂', '蜜粉', '蜜蜂', '信封', '西装', '外套', '裙子', '大象', '猫咪', '母鸡', '路灯', '蓝天', '白云',
        '星月', '彩虹', '微笑', '摩托', '板栗', '高山', '大地', '大树', '电灯胆', '砖头', '楼房', '水池', '鸡翅', '蜻蜓', '红牛', '咖啡', '机器猫', '枕头', '大船', '诺言',
        '钢笔', '刺猬', '天空', '飞机', '大炮', '冬天', '洋葱', '春天', '夏天', '秋天', '冬日', '航空', '毛衣', '豌豆', '黑米', '玉米', '眼睛', '老鼠', '白羊', '帅哥', '美女',
        '季节', '鲜花', '服饰', '裙子', '白开水', '秀发', '大山', '火车', '汽车', '歌曲', '舞蹈', '老师', '导师', '方盒', '大米', '麦片', '水杯', '水壶', '手套', '鞋子', '自行车',
        '鼠标', '手机', '电脑', '书本', '奇迹', '身影', '香烟', '夕阳', '台灯', '宝贝', '未来', '皮带', '钥匙', '心锁', '故事', '花瓣', '滑板', '画笔', '画板', '学姐', '店员',
        '电源', '饼干', '宝马', '过客', '大白', '时光', '石头', '钻石', '河马', '犀牛', '西牛', '绿草', '抽屉', '柜子', '往事', '寒风', '路人', '橘子', '耳机', '鸵鸟', '朋友',
        '苗条', '铅笔', '钢笔', '硬币', '热狗', '大侠', '御姐', '萝莉', '毛巾', '期待', '盼望', '白昼', '黑夜', '大门', '黑裤', '钢铁侠', '哑铃', '板凳', '枫叶', '荷花', '乌龟',
        '仙人掌', '衬衫', '大神', '草丛', '早晨', '心情', '茉莉', '流沙', '蜗牛', '战斗机', '冥王星', '猎豹', '棒球', '篮球', '乐曲', '电话', '网络', '世界', '中心', '鱼', '鸡', '狗',
        '老虎', '鸭子', '雨', '羽毛', '翅膀', '外套', '火', '丝袜', '书包', '钢笔', '冷风', '八宝粥', '烤鸡', '大雁', '音响', '招牌', '胡萝卜', '冰棍', '帽子', '菠萝', '蛋挞', '香水',
        '泥猴桃', '吐司', '溪流', '黄豆', '樱桃', '小鸽子', '小蝴蝶', '爆米花', '花卷', '小鸭子', '小海豚', '日记本', '小熊猫', '小懒猪', '小懒虫', '荔枝', '镜子', '曲奇', '金针菇',
        '小松鼠', '小虾米', '酒窝', '紫菜', '金鱼', '柚子', '果汁', '百褶裙', '项链', '帆布鞋', '火龙果', '奇异果', '煎蛋', '唇彩', '小土豆', '高跟鞋', '戒指', '雪糕', '睫毛', '铃铛',
        '手链', '香氛', '红酒', '月光', '酸奶', '银耳汤', '咖啡豆', '小蜜蜂', '小蚂蚁', '蜡烛', '棉花糖', '向日葵', '水蜜桃', '小蝴蝶', '小刺猬', '小丸子', '指甲油', '康乃馨', '糖豆',
        '薯片', '口红', '超短裙', '乌冬面', '冰淇淋', '棒棒糖', '长颈鹿', '豆芽', '发箍', '发卡', '发夹', '发带', '铃铛', '小馒头', '小笼包', '小甜瓜', '冬瓜', '香菇', '小兔子',
        '含羞草', '短靴', '睫毛膏', '小蘑菇', '跳跳糖', '小白菜', '草莓', '柠檬', '月饼', '百合', '纸鹤', '小天鹅', '云朵', '芒果', '面包', '海燕', '小猫咪', '龙猫', '唇膏', '鞋垫',
        '羊', '黑猫', '白猫', '万宝路', '金毛', '山水', '音响', '纸飞机', '烧鹅'];
    /**
     * 百家姓
     */
    $arrXing = ['赵', '钱', '孙', '李', '周', '吴', '郑', '王', '冯', '陈', '褚', '卫', '蒋', '沈', '韩', '杨', '朱', '秦', '尤', '许', '何', '吕', '施', '张', '孔', '曹', '严', '华', '金', '魏', '陶', '姜', '戚', '谢', '邹',
        '喻', '柏', '水', '窦', '章', '云', '苏', '潘', '葛', '奚', '范', '彭', '郎', '鲁', '韦', '昌', '马', '苗', '凤', '花', '方', '任', '袁', '柳', '鲍', '史', '唐', '费', '薛', '雷', '贺', '倪', '汤', '滕', '殷', '罗',
        '毕', '郝', '安', '常', '傅', '卞', '齐', '元', '顾', '孟', '平', '黄', '穆', '萧', '尹', '姚', '邵', '湛', '汪', '祁', '毛', '狄', '米', '伏', '成', '戴', '谈', '宋', '茅', '庞', '熊', '纪', '舒', '屈', '项', '祝',
        '董', '梁', '杜', '阮', '蓝', '闵', '季', '贾', '路', '娄', '江', '童', '颜', '郭', '梅', '盛', '林', '钟', '徐', '邱', '骆', '高', '夏', '蔡', '田', '樊', '胡', '凌', '霍', '虞', '万', '支', '柯', '管', '卢', '莫',
        '柯', '房', '裘', '缪', '解', '应', '宗', '丁', '宣', '邓', '单', '杭', '洪', '包', '诸', '左', '石', '崔', '吉', '龚', '程', '嵇', '邢', '裴', '陆', '荣', '翁', '荀', '于', '惠', '甄', '曲', '封', '储', '仲', '伊',
        '宁', '仇', '甘', '武', '符', '刘', '景', '詹', '龙', '叶', '幸', '司', '黎', '溥', '印', '怀', '蒲', '邰', '从', '索', '赖', '卓', '屠', '池', '乔', '胥', '闻', '莘', '党', '翟', '谭', '贡', '劳', '逄', '姬', '申',
        '扶', '堵', '冉', '宰', '雍', '桑', '寿', '通', '燕', '浦', '尚', '农', '温', '别', '庄', '晏', '柴', '瞿', '阎', '连', '习', '容', '向', '古', '易', '廖', '庾', '终', '步', '都', '耿', '满', '弘', '匡', '国', '文',
        '寇', '广', '禄', '阙', '东', '欧', '利', '师', '巩', '聂', '关', '荆', '司马', '上官', '欧阳', '夏侯', '诸葛', '闻人', '东方', '赫连', '皇甫', '尉迟', '公羊', '澹台', '公冶', '宗政', '濮阳', '淳于', '单于', '太叔',
        '申屠', '公孙', '仲孙', '轩辕', '令狐', '徐离', '宇文', '长孙', '慕容', '司徒', '司空', '皮'];
    /**
     * 名
     */
    $arrMing = ['伟', '刚', '勇', '毅', '俊', '峰', '强', '军', '平', '保', '东', '文', '辉', '力', '明', '永', '健', '世', '广', '志', '义', '兴', '良', '海', '山', '仁', '波', '宁', '贵', '福', '生', '龙', '元', '全'
        , '国', '胜', '学', '祥', '才', '发', '武', '新', '利', '清', '飞', '彬', '富', '顺', '信', '子', '杰', '涛', '昌', '成', '康', '星', '光', '天', '达', '安', '岩', '中', '茂', '进', '林', '有', '坚', '和', '彪', '博', '诚'
        , '先', '敬', '震', '振', '壮', '会', '思', '群', '豪', '心', '邦', '承', '乐', '绍', '功', '松', '善', '厚', '庆', '磊', '民', '友', '裕', '河', '哲', '江', '超', '浩', '亮', '政', '谦', '亨', '奇', '固', '之', '轮', '翰'
        , '朗', '伯', '宏', '言', '若', '鸣', '朋', '斌', '梁', '栋', '维', '启', '克', '伦', '翔', '旭', '鹏', '泽', '晨', '辰', '士', '以', '建', '家', '致', '树', '炎', '德', '行', '时', '泰', '盛', '雄', '琛', '钧', '冠', '策'
        , '腾', '楠', '榕', '风', '航', '弘', '秀', '娟', '英', '华', '慧', '巧', '美', '娜', '静', '淑', '惠', '珠', '翠', '雅', '芝', '玉', '萍', '红', '娥', '玲', '芬', '芳', '燕', '彩', '春', '菊', '兰', '凤', '洁', '梅', '琳'
        , '素', '云', '莲', '真', '环', '雪', '荣', '爱', '妹', '霞', '香', '月', '莺', '媛', '艳', '瑞', '凡', '佳', '嘉', '琼', '勤', '珍', '贞', '莉', '桂', '娣', '叶', '璧', '璐', '娅', '琦', '晶', '妍', '茜', '秋', '珊', '莎'
        , '锦', '黛', '青', '倩', '婷', '姣', '婉', '娴', '瑾', '颖', '露', '瑶', '怡', '婵', '雁', '蓓', '纨', '仪', '荷', '丹', '蓉', '眉', '君', '琴', '蕊', '薇', '菁', '梦', '岚', '苑', '婕', '馨', '瑗', '琰', '韵', '融', '园'
        , '艺', '咏', '卿', '聪', '澜', '纯', '毓', '悦', '昭', '冰', '爽', '琬', '茗', '羽', '希', '欣', '飘', '育', '滢', '馥', '筠', '柔', '竹', '霭', '凝', '晓', '欢', '霄', '枫', '芸', '菲', '寒', '伊', '亚', '宜', '可', '姬'
        , '舒', '影', '荔', '枝', '丽', '阳', '妮', '宝', '贝', '初', '程', '梵', '罡', '恒', '鸿', '桦', '骅', '剑', '娇', '纪', '宽', '苛', '灵', '玛', '媚', '琪', '晴', '容', '睿', '烁', '堂', '唯', '威', '韦', '雯', '苇', '萱'
        , '阅', '彦', '宇', '雨', '洋', '忠', '宗', '曼', '紫', '逸', '贤', '蝶', '菡', '绿', '蓝', '儿', '翠', '烟'];
    switch ($type) {
        case 1:
            $tou_num = rand(0, count($nicheng_tou) - 1);
            $wei_num = rand(0, count($nicheng_wei) - 1);
            $nicheng = $nicheng_tou[$tou_num] . $nicheng_wei[$wei_num];
            break;
        case 2:
            $nicheng = $arrXing[mt_rand(0, count($arrXing) - 1)];
            for ($i = 1; $i <= 3; $i++) {
                $nicheng .= (mt_rand(0, 1) ? $arrMing[mt_rand(0, count($arrMing) - 1)] : $arrMing[mt_rand(0, count($arrMing) - 1)]);
            }
            break;
    }
    return $nicheng;
}


function _diskSpace()
{
    // 获取磁盘总空间
    $totalSpace = disk_total_space("."); // "." 表示当前目录所在的磁盘分区
    $totalSpaceGB = round($totalSpace / 1024 / 1024 / 1024, 2);
     
    // 获取磁盘可用空间
    $freeSpace = disk_free_space(".");
    $freeSpaceGB = round($freeSpace / 1024 / 1024 / 1024, 2);
     
    // 获取磁盘可用空间的百分比
    $percent = ($totalSpace > 0) ? round(($freeSpace / $totalSpace) * 100, 2) : 0;

    return compact('totalSpace','totalSpaceGB','freeSpace','freeSpaceGB','percent');
}


function _day_first_id($date = '', $last_id = 0, $table = 'privatechat', $column = 'addtime', $pk = 'id')
{
    if (!$date) return 0;
    $strtime = strtotime($date);
    $date = date('Y-m-d', $strtime);
    if ($last_id && $strtime >= time()) return 99999999999999;
    $cachekeyhead = '_day_first_id'.$table.$column.$pk;
    $cachekey = $cachekeyhead.$date;
    if ($id = Cache::store('redisUnclear')->get($cachekey)) {
        return $id;
    }
    if (!$last_id) {
        $num = 1;
        while (!$last_id && $num<7) {
            $last_id = cache($cachekeyhead . date('Y-m-d', $strtime - 86400 * $num))?:0;
            $num++;
        }
    }
    $id = Db::name($table)->where([$pk=>['>=', $last_id]])->whereTime($column, '>=', $date)->order($pk.' asc')->value($pk);

    if ($id) {
        Cache::store('redisUnclear')->set($cachekey, $id, 86400 * 30);
        return $id;
    }
    return 0;
}


function _getUrlHead($path = '')
{
    if (strpos($path, 'http://') !== false || strpos($path, 'https://') !== false) {
        return $path;
    }
    $switch = getenv('APP_OSS');
    if (!$switch) {
        $head = 'http://'.getenv('APP_URL');
    } else {
        $head = 'http://'.getenv('OSS_DOMAIN');
    }
    return $head . $path;
}


function _channelUser($user_id, $source_type = 0)
{
    $user = Db::name('user')->cache(60)->find($user_id);
    if (getenv('APP_MALL_DATABASE') == 'database') return $user;
    $db = Db::connect(getenv('APP_MALL_DATABASE'));

    $has = $db->name('user_channel_profile')->where(['sys_channel'=>getenv('APP_CHANNEL'), 'source_type'=>$source_type, 'source_uid'=>$user_id])->find();
    if ($has) {
        $member_relang = $db->name('user')->find($has['user_id']);
        $member_relang['sex'] = $user['sex'];
        $member_relang['age'] = $user['age'];
    } else {
        $user['sex'] = $user['sex'] ?? '男';
        $dir = $user['sex'] == '男' ? 'male' : 'female';
        $head_portrait = '/public/style/api/img/' . $dir . '/' . mt_rand(1,20) . '.jpg';
        $member_relang = [
            'name'=>$source_type?suiji2():'那蓝之恋_'.$user['id'],
            'head_portrait'=>$head_portrait,
            'sex'=>$user['sex'],
            'age'=>$user['age'],
            'reg'=>$source_type
        ];
        $uid = $db->name('user')->insertGetId($member_relang);
        $member_relang['id'] = $uid;
        $channel_profile = [
            'user_id'=>$uid,
            'sex'=>$user['sex'],
            'name'=>$user['name'],
            'head_portrait'=>$user['head_portrait'],
            'sys_channel'=>getenv('APP_CHANNEL'),
            'create_time'=>time(),
            'source_type'=>$source_type,
            'source_uid'=>$user['id']
        ];
        $channelData = $db->name('user_channel_profile')->insert($channel_profile);
    }
    return $member_relang;
}

function _getAdminName($id = 0)
{
    if (!$id) return '';
    return db('admin')->where(['id'=>$id])->value('name');
}